单元测试:除回调外验证webNode列表是否符合预期的方法
验证webNode列表的替代方法
假设你用的是Moq这类Mock框架,除了回调,还有以下几种直接的验证方式:
使用
It.Is<T>结合断言逻辑
在Verify方法里,直接对传入的列表做条件校验,比如检查列表长度、元素属性是否符合预期:webNodeService.Verify(v => v.Write("W100", It.Is<List<webNode>>(nodes => nodes.Count == 1 && nodes[0].webaddress == "C1" && nodes[0].inputValue == "Example" )));预先构建预期对象,结合自定义相等判断
先创建符合预期的webNode实例,然后验证传入的列表是否与预期匹配。如果webNode类没有重写Equals方法,可以自定义相等比较器来做值比较:var expectedNode = new webNode { webaddress = "C1", inputValue = "Example" }; webNodeService.Verify(v => v.Write("W100", It.Is<List<webNode>>(nodes => nodes.SequenceEqual(new List<webNode> { expectedNode }, new webNodeEqualityComparer()) )));对应的自定义相等比较器实现:
public class webNodeEqualityComparer : IEqualityComparer<webNode> { public bool Equals(webNode x, webNode y) { if (x == null && y == null) return true; if (x == null || y == null) return false; return x.webaddress == y.webaddress && x.inputValue == y.inputValue; } public int GetHashCode(webNode obj) { return HashCode.Combine(obj.webaddress, obj.inputValue); } }使用Moq的
Capture.In捕获参数后验证
用Capture.In把调用时传入的列表捕获到变量中,之后对这个变量做独立断言:List<webNode> capturedNodes = null; webNodeService.Verify(v => v.Write("W100", Capture.In(ref capturedNodes))); // 后续断言 Assert.Equal(1, capturedNodes.Count); Assert.Equal("C1", capturedNodes[0].webaddress); Assert.Equal("Example", capturedNodes[0].inputValue);这种方式把参数提取出来做单独校验,和传统回调逻辑区分度更高。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

