我有工作執行的單位有(其中包括)以下方法:驗證方法調用與Lambda表達式 - 起訂量
T Single<T>(Expression<Func<T, bool>> expression) where T : class, new();
,我稱呼它,比如,像這樣:
var person = _uow.Single<Person>(p => p.FirstName == "Sergi");
如何驗證Single
方法已被調用,參數爲FirstName == "Sergi"
?
我試過以下,但無濟於事:
// 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));
他們都導致如下因素的錯誤:
Expected invocation on the mock at least once, but was never performed
如何任何想法,可以做什麼? 我使用的是最新的Moq從的NuGet,版本4.0.10827.0
更新:一個具體的例子
我所看到的是,每當我用的是拉姆達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);
}
怎麼來的Verify
,只要我使用的方法參數的lambda表達式失敗?
寫這個測試的正確方法是什麼?
非常感謝您的回答。我根據新的呃...發現更新了我的問題,因爲缺乏更好的單詞。有任何想法嗎? –
我已更新我的問題以解決可能是您的問題。這真的取決於QuestionnaireType.Objective的類型。我期望如果你使用'ToString()'這兩個表達式,你會發現它們是不同類型的。 –
再次感謝,我想是有道理的。但是,那麼編寫這個測試的正確方法是什麼呢?我覺得在這種情況下,嘲笑是阻礙,而不是一個更清晰的代碼的工具... –