Nsubstitute Returns 没有在另一个测试用例中被覆盖?
Nsubstitute Returns is not overriden in an other test case?
如果我有要检查的方法,并且出于某种原因,我想将测试用例分成两个单独的用例,我很乐意这样做:
[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));
}
但这里的问题是,当第一个测试用例通过时。更新 return 值是一个异常,所以当第二个测试用例想要获得 return 值时,它也会获得新的 Exception() ;作为 return 值?为什么会这样?我如何覆盖相同方法的 return 值?
发生这种情况是因为您的 _customerRepositoryMock
是您正在 SetUp
方法中初始化的测试 class 中的一个字段。我不确定为什么在每次测试通过后都会保留设置值,因为 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,您可能只需要将第二种方法的 return 值更改为 lambda:
_customerRepositoryMock.Update(Arg.Any<Customer>()).Returns(x => true);
我想你更喜欢哪个。
如果我有要检查的方法,并且出于某种原因,我想将测试用例分成两个单独的用例,我很乐意这样做:
[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));
}
但这里的问题是,当第一个测试用例通过时。更新 return 值是一个异常,所以当第二个测试用例想要获得 return 值时,它也会获得新的 Exception() ;作为 return 值?为什么会这样?我如何覆盖相同方法的 return 值?
发生这种情况是因为您的 _customerRepositoryMock
是您正在 SetUp
方法中初始化的测试 class 中的一个字段。我不确定为什么在每次测试通过后都会保留设置值,因为 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,您可能只需要将第二种方法的 return 值更改为 lambda:
_customerRepositoryMock.Update(Arg.Any<Customer>()).Returns(x => true);
我想你更喜欢哪个。