2012-02-06 125 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