Модульное тестирование хранилища NHibernate - PullRequest
1 голос
/ 06 февраля 2012

У меня возникают некоторые трудности с модульным тестированием моих методов репозитория NHibernate, в основном из-за того, что им передается выражение и возвращается IQueryable.

Вот один из методов репозитория:

public TEntity FindBy<TEntity>(Expression<Func<TEntity, bool>> expression)
{
    return Session.Query<TEntity>().SingleOrDefault(expression);
}

А вот связанный вызов метода:

public Employee Login(string username, string password)
{
    return Repository.FindBy<Employee>
    (
        e => e.Active 
            && e.Username.ToLower() == username.ToLower()
            && e.Password == password
    );
}

И соответствующий модульный тест:

[Test]
public void ForMatchingEmployeeUsernameAndPassword_ReturnsEmployee()
{       
    var employee = HelperEmployee.GetEmployee();

    repository.Setup(x => x.FindBy(It.IsAny<Expression<Func<Employee, bool>>>())).Returns(employee);

    var result = EmployeeService.Login(employee.Username, employee.Password);

    Assert.IsNotNull(result);
    Assert.IsInstanceOf<Employee>(result);
    Assert.AreSame(employee, result);
}

И метод настройки теста:

[SetUp]
public void Init()
{
    mock = new Mock<IRepository>();
    repository = mock.Object;
    EmployeeService = new EmployeeService(repository);
}

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

Есть идеи, где я иду не так? Если я могу предоставить больше информации, дайте мне знать ...

1 Ответ

1 голос
/ 07 февраля 2012

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

IRepository

public interface IRepository
{
    TEntity FindBy<TEntity>(Expression<Func<TEntity, bool>> expression);
}

LoginService

public class LoginService
{
    private readonly IRepository _repository;

    public LoginService(IRepository repository)
    {
        _repository = repository;
    }

    public Employee Login(string username, string password)
    {
        return _repository.FindBy<Employee>
        (
            e => e.Active
                && e.Username.ToLower() == username.ToLower()
                && e.Password == password
        );
    }
}

LoginServiceTests

[TestFixture]
class LoginServiceTests
{
    private IRepository _repository;
    private LoginService _loginService;

    [SetUp]
    public void Setup()
    {
        _repository = MockRepository.GenerateMock<IRepository>();
        _loginService = new LoginService(_repository);
    }

    [Test]
    public void Login_should_return_employee()
    {
        var expected = new Employee { Username = "Jon" };

        _repository.Expect(f => f.FindBy(Arg<Expression<Func<Employee, bool>>>.Is.Anything)).Return(expected);

        var result = _loginService.Login("jon", "mysecret");

        Assert.That(result, Is.InstanceOf<Employee>());
        Assert.That(result, Is.EqualTo(expected));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...