Nsubstitute Returns在另一个测试用例中没有被覆盖?

时间:2015-04-06 12:56:19

标签: c# asp.net-mvc model-view-controller nunit nsubstitute

如果我有方法我想检查,并且出于某种原因,我想在两个不同的情况下拆分测试用例,我很乐意这样做:

    [Test]
    public void EditCustomerShouldReturnExceptionWhenCustomerIsNotCreated()
    {
        var c = new CustomerViewModel();
        _customerRepositoryMock.Update(Arg.Any<Customer>()).Returns(x => { throw new Exception(); });
        Assert.Throws<Exception>(() => _customerService.EditCustomer(c));
    }

    [Test]
    public void EditCustomerShouldReturnTrueWhenCustomerIsCreated()
    {
        var c = new CustomerViewModel();
        _customerRepositoryMock.Update(Arg.Any<Customer>()).Returns(true);
         Assert.IsTrue(_customerService.EditCustomer(c));
    }

但问题是当第一个测试用例被传递时.Update返回值是一个异常,因此当第二个测试用例想要获得返回值时,它也会获得新的Exception();作为回报值?它为什么会发生?我如何覆盖相同方法的返回值?

1 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为您的_customerRepositoryMock是您在SetUp方法中初始化的测试类中的字段。我不确定为什么在每次测试通过后都会保留设置值,因为SetUp方法应该在每个测试方法之前运行。您是否还实施了TearDown

总的来说,我强烈建议您使用局部变量而不是字段。特别是在测试中,当你为每种测试方法以不同的方式设置模拟时更是如此。

如果使用局部变量,则不会出现此行为。

编辑:试试这个:

[Test]
public void EditCustomerShouldReturnExceptionWhenCustomerIsNotCreated()
{
    var c = new CustomerViewModel();
    var customerRepositoryMock = Substitute.For<ICustomerRepository>();
    var customerService = new CustomerService(customerRepositoryMock);
    customerRepositoryMock.Update(Arg.Any<Customer>()).Returns(x => { throw new Exception(); });
    Assert.Throws<Exception>(() => customerService.EditCustomer(c));
}

[Test]
public void EditCustomerShouldReturnTrueWhenCustomerIsCreated()
{
    var c = new CustomerViewModel();
    var customerRepositoryMock = Substitute.For<ICustomerRepository>();
    var customerService = new CustomerService(customerRepositoryMock);
    customerRepositoryMock.Update(Arg.Any<Customer>()).Returns(true);
     Assert.IsTrue(customerService.EditCustomer(c));
}

或者,查看a similar question,您可能只需要将第二个方法的返回值更改为lambda:

_customerRepositoryMock.Update(Arg.Any<Customer>()).Returns(x => true);

我认为这是你更喜欢的。