Фреймворк, такой как Moq, не полностью заменяет Assert
фреймворка тестирования. иногда это так, иногда нет.
Давайте сначала проведем различие между издевательствами и окурками. Заглушки используются исключительно для изоляции и для введения какого-либо контролируемого поведения в тестируемую систему (SUT).
Моты - это расширенный набор заглушек, и они могут проверить, было ли вызвано что-то на макете. В Moq вызов Verify()
делает заглушку насмешкой в отношении этого метода. Вызов VerifyAll()
делает все методы, которые были установлены, ложными.
Рекомендуемый подход заключается в том, что в вашем тесте должно быть не более одного макета. В этом смысле это похоже на Assert
- вы не должны проверять более чем одну вещь в тесте.
Возвращаясь к первоначальному вопросу. Если вы выполняете тестирование состояния, то вы бы использовали ноль или более заглушек и одно утверждение. Если вы проводите интерактивное тестирование, вы бы использовали ноль или более заглушек и один макет. Ниже приведен пример, в котором может быть целесообразно использовать как макеты, так и утверждения для тестирования одного и того же сервиса.
public interface IAccountRepository {
decimal GetBalance(int accountId);
void SetBalance(int accountId, decimal funds);
}
public class DepositTransaction {
IAccountRepository m_repo;
public DepositTransaction(IAccountRepository repo) {
m_repo = repo;
}
public decimal DepositedFunds {get; private set;};
void Deposit(int accountId, decimal funds) {
decimal balance = m_repo.GetBalance(accountId);
balance += funds;
m_repo.SetBalance(balance);
DepositedFunds += funds;
}
}
public class DepositTest {
[TestMethod]
void DepositShouldSetBalance() {
var accountMock = new Mock<IAccountRepository>();
accountMock.Setup(a=>a.GetBalance(1)).Returns(100); //this is a stub with respect to GetBalance
var transation = new DepositTransaction(accountMock.Object);
transation.Deposit(1, 20);
accountMock.Verify(a=>a.SetBalance(1, 120)); //this is a mock with respect to SetBalance
}
[TestMethod]
void DepositShouldIncrementDepositedFunds() {
var accountMock = new Mock<IAccountRepository>();
accountMock.Setup(a=>a.GetBalance(1)).Returns(100); //this is a stub with respect to GetBalance
var transation = new DepositTransaction(accountMock.Object);
transation.Deposit(1, 20);
transation.Deposit(1, 30);
Assert.AreEqual(50, transaction.DepositedFunds);
}
}