测试方法
// 准备 Mock IFoo 接口
var mock = new Mock<IFoo>();
// 配置准备模拟的方法,当调用接口中的 DoSomething 方法,并传递参数 "bing" 的时候,返回 true
mock.Setup(foo => foo.DoSomething("ping")).Returns(true);
// 方法的参数中使用了 out 参数
// out arguments
var outString = "ack";
// 当调用 TryParse 方法的时候,out 参数返回 "ack", 方法返回 true, lazy evaluated
mock.Setup(foo => foo.TryParse("ping", out outString)).Returns(true);
// ref 参数
var instance = new Bar();
// 仅仅在使用 ref 调用的时候,才会匹配下面的测试
mock.Setup(foo => foo.Submit(ref instance)).Returns(true);
// 当方法返回值得时候,还可以访问返回的值
// 这里可以使用多个参数
mock.Setup(x => x.DoSomething(It.IsAny<string>()))
.Returns((string s) => s.ToLower());
// 在被调用的时候抛出异常
mock.Setup(foo => foo.DoSomething("reset")).Throws<InvalidOperationException>();
mock.Setup(foo => foo.DoSomething("")).Throws(new ArgumentException("command");
// 延迟计算返回的结果
mock.Setup(foo => foo.GetCount()).Returns(() => count);
// 在每一次调用的时候,返回不同的值
var mock = new Mock<IFoo>();
var calls = 0;
mock.Setup(foo => foo.GetCountThing())
.Returns(() => calls)
.Callback(() => calls++);
// 第一次调用返回 0, 下一次是 1, 依次类推
Console.WriteLine(mock.Object.GetCountThing());
Mock接口
而由于Moq对依赖项进行了包装, 所以要获得实际的mock依赖项, 我们需要使用mockExamination.Object属性. 而这个属性的类型就是IPhysicalExamination.
Mock<IPhysicalExamination> mockExamination = new Mock<IPhysicalExamination>();
var approval = new TransferApproval(mockExamination.Object);
It类
这里用到了It
这个类, 在Moq里, It这个类是用来做参数匹配的, it 就是"它"的意思, 它就代表需要被匹配的参数.
It.IsAny<T>()
, 它表示传递给方法的参数的类型只要是T
就可以, 值是任意的. 只要满足了这个条件, 那么方法的返回值就是后边Returns()
方法里设定的值.
Mock<IPhysicalExamination> mockExamination = new Mock<IPhysicalExamination>();
mockExamination.Setup(x => x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>())).Returns(true);
var approval = new TransferApproval(mockExamination.Object);
它有下面几种用法:
-
Is<TValue>(Expression<Func<TValue, Boolean>>)
可以接受一个表达式作为参数,并指定参数应该满足的条件。在Moq中,参数匹配器用于定义模拟对象应该如何响应特定输入的情况。
mock.Setup(x => x.MyMethod(It.Is<int>(value => value > 10))).Returns(true);
-
IsAny<TValue>()
-
IsIn<TValue>(IEnumerable<TValue>)
-
IsInRange<TValue>(TValue, TValue, Range)
-
IsNotIn<TValue>(IEnumerable<TValue>)
-
IsNotNull<TValue>()
-
IsRegex(string)
参考
使用 Moq 测试.NET Core 应用 - Why Moq? - yangxu-pro - 博客园
标签:Moq,单元测试,Returns,Mock,new,foo,Setup,mock From: https://www.cnblogs.com/tangge/p/17537688.html