我有一个工作单元实现,其中包括以下方法:
T Single<T>(Expression<Func<T, bool>> expression) where T : class, new();
例如,我将其称为:
var person = _uow.Single<Person>(p => p.FirstName == "Sergi");
如何验证使用FirstName == "Sergi"
的参数调用了Single
方法?
我尝试过以下方法,但没有成功:
// direct approach
session.Verify(x => x.Single<Person>(p => p.FirstName == "Sergi"));
// comparing expressions
Expression<Func<Person, bool>> expression = p => p.FirstName == "Sergi");
session.Verify(x => x
.Single(It.Is<Expression<Func<Person, bool>>>(e => e == expression));
它们都会导致以下错误:
期望在模拟对象上至少调用一次,但从未执行
有什么想法吗? 我正在使用最新的Moq版本4.0.10827.0来自NuGet。
更新:具体示例
我发现只要在lambda内部使用字符串字面量,Verify
就工作正常。 但是一旦我比较变量,它就会失败。 例如:
// the verify
someService.GetFromType(QuestionnaireType.Objective)
session.Verify(x => x.Single<Questionnaire>(q =>
q.Type == QuestionnaireType.Objective));
// QuestionnaireType.Objective is just a constant:
const string Objective = "objective";
// the method where it's called (FAILS):
public Questionnaire GetFromType(string type)
{
// this will fail the Verify
var questionnaire = _session
.Single<Questionnaire>(q => q.Type == type);
}
// the method where it's called (PASSES):
public Questionnaire GetFromType(string type)
{
// this will pass the Verify
var questionnaire = _session
.Single<Questionnaire>(q => q.Type == QuestionnaireType.Objective);
}
当我在lambda表达式中使用方法参数时,为什么Verify
会立即失败?
写这个测试的正确方法是什么?
ToString()
操作,您会发现它们是不同类型的。 - Kaleb PedersonCallback()
,当您需要测试私有辅助方法所返回的值对输入参数的影响时。 - gabe