上一章我们将讲了伪造属性和事件
这一章我们将参数匹配,回调,和验证
It
:参数匹配
It
这个类其实我们已经在前面有所涉及。我们使用It.IsAny<string>()
匹配任意字符串。
fakeFoo.Setup(fake => fake.DoSomething(It.IsAny<string>())).Returns((string value)=>value+"makes me slim");
其实It
的功能非常强大,而且简单易用。直接看API名称就能了解。
这里就简单列出,不载赘述。
-
It.IsAny<T>
,匹配指定类型参数 -
It.IsNotNull<T>
,匹配指定类型参数,Null
除外 -
It.Is<T>(Predicate)
,匹配指定类型参数,满足Predicate
的条件 -
It.IsInRange<T>(T from, T to, Range rangeKind)
,匹配指定类型参数,满足一定的from
到to
的范围。其中
Range.Inclusive
代表参数在[from,to]
之内满足其中
Range.Exclusive
代表参数在(from,to)
之内满足 -
It.IsIn<T>(IEnumerable<T> items)
,匹配指定类型参数,在序列内 -
It.IsIn<T>(params T[] items)
,匹配指定类型参数,在序列内 -
It.IsNotIn<T>(IEnumerable<T> items)
,匹配指定类型参数,在序列外 -
It.IsNotIn<T>(params T[] items)
,匹配指定类型参数,在序列外 -
It.IsRegex(string regex)
,字符串正则匹配 -
It.IsRegex(string regex, RegexOptions options)
,字符串正则匹配
CallBack
:回调
CallBack
是指在执行一个Setup
的伪造方法时,执行一个回调函数
他的无参数结构是
//无参数
fakeFoo.Setup(fake => fake.DoSomething(It.IsAny<string>()))
.Returns(true)
.Callback(() => call++);
他的带参数结构有两种
//普通参数格式
fakeFoo.Setup(fake => fake.DoSomething(It.IsAny<string>()))
.Returns(true)
.Callback((string s) => callArgs.Add(s));
//泛型参数格式
fakeFoo.Setup(fake => fake.DoSomething(It.IsAny<string>()))
.Returns(true)
.Callback<string>(s => callArgs.Add(s));
当然你还可以选择回调时机
//回调时机
fakeFoo.Setup(fake => fake.DoSomething(It.IsAny<string>()))
.Callback(() => Console.WriteLine("Before returns"))
.Returns(true)
.Callback(() => Console.WriteLine("After returns"));
Verification
:验证
验证是Assert
环节行为,此时的伪对象作用是Mock
这里也只列出基本功能
-
Verify(expression)
,验证表达式是否被执行 -
Verify(expression,times)
,验证表达式的执行次数其中
Times
结构体构造可以参见官方文档 -
VerifyGet<T>(expression)
,验证属性Get
是否被执行 -
VerifyGet<T>(expression,times)
,验证属性Get
的执行次数 -
VerifySet<T>(expression)
,验证属性Set
是否被执行 -
VerifySet<T>(expression,times)
,验证属性Set
的执行次数 -
VerifyNoOtherCalls()
,处理已经验证的调用外,fake对象没有其他调用
本文会经常更新,请阅读原文: https://xinyuehtx.github.io/post/Moq%E5%9F%BA%E7%A1%80-%E4%BA%94.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名黄腾霄(包含链接: https://xinyuehtx.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。