【发布时间】:2012-02-06 01:40:48
【问题描述】:
我在对我的 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);
}
当我尝试模拟存储库方法时出现了我的问题,我将逻辑传递给它,而不是在它返回的结果上执行逻辑。所以很难测试我的逻辑,因为我忽略了它并返回我在模拟中设置的任何内容。
任何想法我哪里出错了?如果我可以提供更多信息,请告诉我...
【问题讨论】:
-
repository实例似乎没有注入到EmployeeService。你是如何构建EmployeeService的? -
嗨 Jonathon,我将它注入到测试夹具 SetUp 方法中:EmployeeService = new EmployeeService(repository);
-
您发布的测试的第一行显示了
repository的定义。这发生在调用SetUp方法之后,这意味着未使用模拟。也许将您的SetUp方法添加到上面。 -
更新包括测试设置方法:)
-
请注意确定是否是您的问题,但您发布的存储库方法与您正在模拟的方法不同。
标签: .net unit-testing nhibernate