Вам нужно проверить дубликаты .
Вы правы, что модульные тесты не должны вызывать другие методы, поэтому вам необходимо "подделать" зависимости.Это можно сделать одним из двух способов:
- Ручные тестовые дубликаты
- Насмешливые
Тестовые дубликаты позволяют изолировать ваш метод втест из его зависимостей.
Я использую Moq для насмешек.Ваш модульный тест должен отправлять «фиктивные» значения параметров или статически определенные значения, которые вы можете использовать для проверки потока управления:
public class MyTestObject
{
public List<Thingie> GetTestThingies()
{
yield return new Thingie() {id = 1};
yield return new Thingie() {id = 2};
yield return new Thingie() {id = 3};
}
}
Если метод вызывает любые другие классы / методы, используйте mocks (иначе)фальшивки ").Mocks - это динамически генерируемые объекты, основанные на виртуальных методах или интерфейсах:
Mock<IRepository> repMock = new Mock<IRepository>();
MyPage obj = new MyPage() //let's pretend this is ASP.NET
obj.IRepository = repMock.Object;
repMock.Setup(r => r.FindById(1)).Returns(MyTestObject.GetThingies().First());
var thingie = MyPage.GetThingie(1);
Приведенный выше объект Mock использует метод Setup
для возврата того же результата для вызова, определенного в лямбде r => r.FindById(1)
.Это называется ожиданием .Это позволяет вам тестировать только код в вашем методе, фактически не вызывая какие-либо зависимые классы.
После того, как вы настроили тест таким образом, вы можете использовать функции Moq, чтобы подтвердить, что все произошло так, как он должен был:
//did we get the instance we expected?
Assert.AreEqual(thingie.Id, MyTestObject.GetThingies().First().Id);
//was a method called?
repMock.Verify(r => r.FindById(1));
Метод Verify позволяет вам тестироватьбыл ли вызван метод.Вместе эти средства позволяют вам сосредоточить свои юнит-тесты на одном методе за один раз.