7)Received的使用
另外,我们还可以检验替代对象的指定场景是否被调用,而哪些场景没有被调用,例如:
calculator.Add(1, 2);
calculator.Received().Add(1, 2);
calculator.DidNotReceive().Add(5, 7);
如果场景在之前没有被调用,Received() 断言则会失败。
例如:calculator.Received().Add(2, 3);
我们将会发现测试异常的提示信息如下:
测试方法 Calculator.Tests.ICalculatorTest.AddTest 引发了异常: NSubstitute.Exceptions.ReceivedCallsException: Expected to receive a call matching: Add(2, 3) Actually received no matching calls. Received 1 non-matching call (non-matching arguments indicated with '*' characters): Add(*1*, *2*) |
NSubstitute支持设置参数返回值,并断言已经被调用。下面是更复杂的使用:
calculator.Add(10, -5); calculator.Received().Add(10, Arg.Any<int>());//第二个参数的值为任一int类型的整数。 calculator.Received().Add(10, Arg.Is<int>(x => x < 0));//第二个参数的值必须是小于零,否则将报异常 |
我们还可以使用替代对象的参数匹配及通过Returns()方法得到一些更多的行为:
//定义第一个参数及第二个参数为任意整数,并且返回值为两个参数之和。 calculator.Add(Arg.Any<int>(), Arg.Any<int>()).Returns(x => (int)x[0] + (int)x[1]); Assert.AreEqual(calculator.Add(5, 10), 15); |
4、测试对象属性及事件委托
1)定义一个接口:
public interface IPerson { string Name { get; set; } event EventHandler Sleep; } |
2)创建测试项目、及测试程序
3)引用NSubstitute.dll,并声明命名空间
首先,在C#测试源码文件添加命名空间引用
using NSubstitute。
4)创建接口实例
target= Substitute.For<IPerson>();
5)测试属性的读写操作
target.Name.Returns("小明"); //测试属性的读操作 Assert.AreEqual(target.Name, "小明"); //对属性进行写操作 target.Name = "王二"; Assert.AreEqual(target.Name, "王二"); |
还可以使用Returns()设置的多个返回值序列
target.Name.Returns("A", "B", "C"); Assert.AreEqual(target.Name, "A"); Assert.AreEqual(target.Name, "B"); Assert.AreEqual(target.Name, "C"); |
6)测试事件
bool eventWasRaised = false; //定义委托事件 target.Sleep += (sender, args) => eventWasRaised = true; //触发事件 target.Sleep += Raise.Event(); //断言事件被触发 Assert.IsTrue(eventWasRaised); |