我有一些困难,单元测试我的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