Я создавал пару модульных тестов, где хотел проверить, вызывается ли метод с параметром, свойства которого я ожидал.
Итак, учитывая эту очень простую систему:
public class Employee
{
public bool IsEmployed { get; set; }
}
public class DataStore
{
public void UpdateEmployee(Employee obj)
{
// Save in DB
}
}
public interface IDataStore
{
void UpdateEmployee(Employee employee);
}
public Employee FireEmployee(IDataStore dataStore, Employee employee)
{
employee.IsEmployed = false;
dataStore.UpdateEmployee(employee);
return employee;
}
Я хочу убедиться, что метод DataStore.UpdateEmployee()
вызывается, когда для свойства Employee.IsEmployed
установлено значение false.Итак, вот два теста, которые, как я считаю, должны выполнить одно и то же.
[Test]
public void TestViaVerify()
{
//Arrange
Mock<IDataStore> dataStore = new Mock<IDataStore>();
var robert = new Employee { IsEmployed = true };
//Act
FireEmployee(dataStore.Object, robert);
//Assert
dataStore.Verify(x => x.UpdateEmployee(It.Is<Employee>(e => e.IsEmployed == false)), Times.Once);
}
[Test]
public void TestViaSetupVerifyAll()
{
//Arrange
Mock<IDataStore> dataStore = new Mock<IDataStore>();
dataStore.Setup(x => x.UpdateEmployee(It.Is<Employee>(e => e.IsEmployed == false)));
var robert = new Employee { IsEmployed = true };
//Act
FireEmployee(dataStore.Object, robert);
//Assert
dataStore.VerifyAll();
}
Учитывая текущий код системы, оба теста пройдены, как и ожидалось.
Теперь, скажем, появился другой разработчик и случайно перенес настройку Employee.IsEmployed = false;
после метода DataStore.UpdateEmployee()
.Теперь в этом случае я хочу, чтобы мои тесты не прошли, потому что сотрудник не будет помечен как безработный в БД.
public Employee FireEmployee(IDataStore dataStore, Employee employee)
{
dataStore.UpdateEmployee(employee);
employee.IsEmployed = false;
return employee;
}
Теперь, когда я запускаю тест:
TestViaVerify Проходит
TestViaSetupVerifyAll Fails
Я ожидал, что оба из них не удастся, но похоже на метод TestViaVerify()
, лямбда в методе выполняетсяв конце теста, где Employee.IsEmployed
уже установлено в false.
Есть ли способ выполнить то, что я хочу, используя метод Verify?И не надо делать настройки ... VerifyAll
?Если его нет, я просто пойду с TestViaVerifyAll()
подходом.