Как проверить сервисный слой, который напрямую использует NHibernate? - PullRequest
1 голос
/ 14 декабря 2011

Здравствуйте, кто-нибудь может дать мне совет, как протестировать мой сервисный уровень, который напрямую использует NHibernate ISession?

public class UserAccountService : IUserAccountService
{
    private readonly ISession _session;

    public UserAccountService(ISession session)
    {
        _session = session;
    }

    public bool ValidateUser(string email, string password)
    {
        var value = _session.QueryOver<UserInfo>()
            .Select(Projections.RowCount()).FutureValue<int>().Value;

        if (value > 0) return true;
        return false;
    }
}

Я предпочитаю использовать NHibernate напрямую для простых случаев, таких как простой запрос, проверки и создание / обновление записей в базе данных. Потому что я не хочу иметь абстракцию наподобие слоя хранилища / дао поверх Nhibernate, которая только добавит больше сложности моей архитектуре.

Ответы [ 2 ]

2 голосов
/ 14 декабря 2011

Вам нужно решить, что вы хотите на самом деле протестировать на своем уровне обслуживания, независимо от того, используете ли вы NH.

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

В этом случае вам просто нужно будет заглушить переменную сеанса и настроить ожидания, используя какую-то фиктивную среду (например, Rhino Mocks), которая будет ожидать предварительно определенный адрес электронной почты и пароль, а затем вернуть ожидаемый результат .

Какой-то псевдокод для этого может выглядеть так:

void ValidateUser_WhenGivenGoodEmailAndPassword_ReturnsTrue()
{
  //arrange
  var stubbedSession = MockRepository.GenerateStub<ISession>();

  stubbedSession
      .Expect(x => x.Query<UserInfo>())
      .Return(new List { 
          new UserInfo { Email = "johns@email.com", Password = "whatever" } });

  var service = new UserAccountService(stubbedSession);

  //act
  var result = service.ValidateUser("johns@email.com", "whatever");

  //assert
  Assert.That(result, Is.True);
}
0 голосов
/ 14 декабря 2011

Я думаю, вам будет сложно тестировать взаимодействие с базой данных статическим способом. Я бы рекомендовал делегировать обязанности другому уровню (тому уровню, который добавляет сложность, который вы упомянули), который можно смоделировать для целей тестирования, если вы считаете, что функциональность достаточно важна для тестирования.

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