如果我有方法我想检查,并且出于某种原因,我想在两个不同的情况下拆分测试用例,我很乐意这样做:
[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();作为回报值?它为什么会发生?我如何覆盖相同方法的返回值?
答案 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);
我认为这是你更喜欢的。