Посевной репозиторий Rhino Mocks - PullRequest
2 голосов
/ 18 июня 2010

Я начинаю свой первый путь разработки, управляемой тестами, на C #.Для начала я использую MSTest и Rhino.Mocks .Я пытаюсь написать свои первые юнит-тесты против моего ICustomerRepository.Кажется утомительным вводить Customer для каждого метода испытаний.В ruby-on-rails я создавал исходный файл и загружал клиента для каждого теста.Кажется логичным, что я мог бы поместить эту котельную плиту Customer в свойство тестового класса, но тогда я рискнул бы ее изменить.Какие есть варианты для упрощения этого кода?

[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();
}

Ответы [ 3 ]

3 голосов
/ 18 июня 2010

Ваши модульные тесты не имеют никакой реальной ценности, потому что они просто тестируют Rhino.Mocks.

Что вы хотите сделать, это использовать Rhino.Mocks для создания заглушки ICustomerRepository для других компонентов / сервисов, которыенужен репозиторий ICustomer.Таким образом, вместо использования CustomerRepository, который взаимодействует с базой данных или каким-либо простым файлом, вы будете использовать заглушки ICustomerRepository и Rhino.Mocks, которые позволят вам настроить предопределенные ответы на определенные методы, что позволит вам тестировать свои сервисы визоляция.

2 голосов
/ 18 июня 2010

Вы можете защитить себя от изменений в тестовом клиенте, изменив свои заглушки и утверждения, чтобы использовать его свойства:

[TestMethod]
public void CanGetCustomerByDifId() {

    var customer = this.TestCustomer;

    var repository = Stub<ICustomerRepository>();

    repository.Stub(rep => rep.GetCustomerByDifID(customer.DifID))
              .Return(customer);

    Assert.AreEqual(customer, repository.GetCustomerByDifID(customer.DifID));
}
2 голосов
/ 18 июня 2010

Я бы извлек код для создания клиента в метод. Вы можете вызвать это из ваших методов тестирования, и если вы назовете его как-то вроде SetUpCustomerForRepository, тогда он предоставит некоторую документацию о том, что вы делаете.

Вот пример, основанный на вашем образце:

 private Customer SetUpCustomerForRepository()
 {
    return new Customer()
    {
        CustId = 5,
        DifId = "55",
        CustLookupName = "The Dude",
        LoginList = new[] {
            new Login { LoginCustId = 5, LoginName = "tdude" } }
    };
 }

Вы также можете вызвать его из метода настройки теста, но я на самом деле предпочитаю делать это в методе теста, чтобы люди, изучающие тест, знали, что настраивается для теста.

Что касается вашего беспокойства по поводу его изменения .... если это произойдет, то ваши тесты не пройдут, и вы узнаете об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...