Я приступаю к первому путешествию, основанному на тестах, на C#. Для начала я использую MSTest и Rhino.Mocks. Я пытаюсь написать свои первые модульные тесты против моего ICustomerRepository
. Кажется утомительным для нового метода Customer
для каждого метода тестирования. В ruby-on-rails я бы создал файл семян и загрузил клиента для каждого теста. Кажется логичным, что я мог бы поставить эту плиту котла Customer
в свойство тестового класса, но тогда я рискну его модифицировать. Каковы мои возможности для упрощения этого кода?Seeding repository Rhino Mocks
[TestMethod]
public class CustomerTests : TestClassBase
{
[TestMethod]
public void CanGetCustomerById()
{
// arrange
var customer = new Customer()
{
CustId = 5,
DifId = "55",
CustLookupName = "The Dude",
LoginList = new[] {
new Login { LoginCustId = 5, LoginName = "tdude" } }
};
var repository = Stub<ICustomerRepository>();
// act
repository.Stub(rep => rep.GetById(5)).Return(customer);
// assert
Assert.AreEqual(customer, repository.GetById(5));
}
[TestMethod]
public void CanGetCustomerByDifId()
{
// arrange
var customer = new Customer()
{
CustId = 5,
DifId = "55",
CustLookupName = "The Dude",
LoginList = new[] {
new Login { LoginCustId = 5, LoginName = "tdude" } }
};
var repository = Stub<ICustomerRepository>();
// act
repository.Stub(rep => rep.GetCustomerByDifID("55")).Return(customer);
// assert
Assert.AreEqual(customer, repository.GetCustomerByDifID("55"));
}
[TestMethod]
public void CanGetCustomerByLogin()
{
// arrange
var customer = new Customer()
{
CustId = 5,
DifId = "55",
CustLookupName = "The Dude",
LoginList = new[] {
new Login { LoginCustId = 5, LoginName = "tdude" } }
};
var repository = Stub<ICustomerRepository>();
// act
repository.Stub(rep =>
rep.GetCustomerByLogin("tdude")).Return(customer);
// assert
Assert.AreEqual(customer, repository.GetCustomerByLogin("tdude"));
}
}
Тест Базовый класс
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();
}
Я думаю, что я знаю, что вы говорите, но не могли бы вы поместить его в код ради потомства? :) – ahsteele
Добавил метод создания клиента, а затем заметил, что ваши тесты используют разные условия для заглушки в Rhino Mocks, поэтому, вероятно, лучше оставить их в тесте (таким образом, проще видеть, что вы тестируете) , – ckramer