我有一些困難,單元測試我的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);
}
我的問題出現了,我傳遞的邏輯它,而不是在它返回的結果執行的邏輯。所以很難測試我的邏輯,因爲我忽略了它,並返回了我在模擬中設置的任何東西。
任何想法我錯了嗎?如果我可以提供更多的信息讓我知道...
的'repository'實例不會出現被注入'EmployeeService'。你如何構造'EmployeeService'? – Jonathan 2012-02-06 03:55:32
嗨Jonathon,我在測試夾具SetUp方法中注入它:EmployeeService = new EmployeeService(repository); – timothyclifford 2012-02-06 04:00:55
您發佈的測試的第一行顯示了'repository'的定義。這發生在SetUp方法被調用之後,這意味着不使用模擬。也許加入你的'SetUp'方法到上面。 – Jonathan 2012-02-06 04:07:54