2012-02-06 55 views
1

我有一些困难,单元测试我的NHibernate存储库方法,基本上是由于他们正在传递一个表达式并返回一个IQueryable的事实。单元测试NHibernate存储库

这里的仓库方法之一:

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

的'repository'实例不会出现被注入'EmployeeService'。你如何构造'EmployeeService'? – Jonathan 2012-02-06 03:55:32

+0

嗨Jonathon,我在测试夹具SetUp方法中注入它:EmployeeService = new EmployeeService(repository); – timothyclifford 2012-02-06 04:00:55

+1

您发布的测试的第一行显示了'repository'的定义。这发生在SetUp方法被调用之后,这意味着不使用模拟。也许加入你的'SetUp'方法到上面。 – Jonathan 2012-02-06 04:07:54

回答

1

我想我已经设法使用NUnit和RhinoMocks来得到您正在尝试做的工作示例。所有这些测试都在检查FindBy是否被调用,我认为你需要一个集成测试来覆盖正确的过滤器表达式。

IRepository

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

login服务

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)); 
    } 
} 
+0

感谢您的所有帮助队友,我想我会略微错误的路径尝试测试存储库方法而不是逻辑:) – timothyclifford 2012-02-07 06:43:28