Я тестирую модуль ICustomerRepository
, используемый для извлечения объектов типа Customer
.Какова цель модульного тестирования репозитория интерфейса
- В качестве единицы измерения, какое значение я получаю путем тестирования
ICustomerRepository
таким образом? - При каких условиях не удалось выполнить тест ниже?
- Для тестов такого характера целесообразно проводить тесты, которые, как я знаю, должны терпеть неудачу? т.е. ищет идентификатор
4
, когда я знаю, что я только помещен5
в хранилище
Я, вероятно, отсутствует что-то очевидное, но, кажется, интеграционные тесты класса, реализующего ICustomerRepository
будет иметь большую ценность.
[TestClass]
public class CustomerTests : TestClassBase
{
private Customer SetUpCustomerForRepository()
{
return new Customer()
{
CustId = 5,
DifId = "55",
CustLookupName = "The Dude",
LoginList = new[]
{
new Login { LoginCustId = 5, LoginName = "tdude" },
new Login { LoginCustId = 5, LoginName = "tdude2" }
}
};
}
[TestMethod]
public void CanGetCustomerById()
{
// arrange
var customer = SetUpCustomerForRepository();
var repository = Stub<ICustomerRepository>();
// act
repository.Stub(rep => rep.GetById(5)).Return(customer);
// assert
Assert.AreEqual(customer, repository.GetById(5));
}
}
Тест Базовый класс
public class TestClassBase
{
protected T Stub<T>() where T : class
{
return MockRepository.GenerateStub<T>();
}
}
ICustomerRepository и IRepository
public interface ICustomerRepository : IRepository<Customer>
{
IList<Customer> FindCustomers(string q);
Customer GetCustomerByDifID(string difId);
Customer GetCustomerByLogin(string loginName);
}
public interface IRepository<T>
{
void Save(T entity);
void Save(List<T> entity);
bool Save(T entity, out string message);
void Delete(T entity);
T GetById(int id);
ICollection<T> FindAll();
}
Как? Всюду, где я читаю, нас учат фальсифицировать интерфейс для нашего модульного теста. Как мы можем протестировать конкретную реализацию? Я думал, что этого следует избегать до моего понимания. Не могли бы вы привести пример? Спасибо! – Stack0verflow
Интерфейс - это спецификация, декларация, а не код, который вы можете запустить (и, следовательно, тест). Вы реализуете эту спецификацию в конкретных классах, и это код, который вы будете запускать и тестировать. Вы можете использовать макет для реализации интерфейса, чтобы помочь вам в тестировании * другого * кода, который зависит от объектов, реализующих этот интерфейс. Вы не «проверяете интерфейс», вы проверяете правильность реализаций этого интерфейса, вызывая методы интерфейса для этих реализаций («тест против интерфейса»). –
Глупый пример: интерфейс «Eater» для вещей, которые «едят», реализуемые «Dog» и вызываемые «мастером» в методе «feed (Eater pet)». Когда вы проверите 'Собака', вы проверите ее реализацию интерфейса« Eater », вызвав« eat »на экземпляр собаки и посмотрите, например. что собака получает вес. Когда вы проверяете метод '' '' '' '' '' '' '' '' '' '' '' '' '' '' ', вы создаете mock' Eater', передаете его этому методу и проверяете, что 'eat' был вызван на него. –