2013-09-26 48 views
1

我試圖用Moq模擬我的一些庫調用,並且大部分單元測試都已經正常工作了,但是我已經有了一種可以似乎沒有正確的嘲弄。使用Moq嘲弄庫函數參數使用Moq

我需要被嘲笑庫調用具有以下特徵:

IEnumerable<T> Get(
    Expression<Func<T, bool>> filter = null, 
    Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, 
    string includeProperties = ""); 

,我是單元測試的方法如下:

public bool CheckForTaskUsage(int taskId) 
{ 
    return _taskInstanceRepository.Get(x => x.Task.Id == taskId).Any(); 
} 

單元測試如下:

Task task_1 = new Task() { Id = 1 }; 
TaskInstance taskInstance_1 = new TaskInstance() { Id = 1, Task = task_1 }; 
_domainTaskInstances = new List<TaskInstance>() { taskInstance_1 }; 

[TestMethod()] 
public void TaskService_CheckForTaskUsage_Success() 
{ 
    int taskId = 1; 
    //_taskInstanceRepository.Setup(x => x.Get(y => y.Task.Id == taskId,null,"")) 
    // .Returns(_domainTaskInstances); 
    _taskInstanceRepository.Setup(x => x.Get(null, null, "")) 
     .Returns(_domainTaskInstances); 
    bool expected = true; 
    bool actual; 
    actual = GetTarget().CheckForTaskUsage(taskId); 
    Assert.AreEqual(expected, actual); 
} 

無論如何,測試失敗,因爲CheckForTaskUsage的調用返回false,正如你所看到的應用於Moq設置的_domainTaskInstances不正確。我已經完成了代碼,它應該可以正常工作,它可以通過UI按預期工作。

然後,我嘗試重新創建在CheckForTaskUsage方法中使用的Func<>(您可以在單元測試中看到此嘗試已註釋掉),即使簽名和變量應該相同,也會失敗。

最後,作爲一個測試,我試圖修改CheckForTaskUsage方法內容如下:

return _taskInstanceRepository.Get().Where(x => x.Task.Id == taskId).Any(); 

這使得測試順利通過,但我不想改變我的方法的代碼允許單元測試通過!

我相信問題是我需要重新創建Func<>參數,因爲我已經嘗試了,但我不知道我在這裏做錯了什麼,任何建議都會非常受歡迎!

感謝

(PS我知道我沒有所有的代碼在這裏(例如一些變量聲明等),但我知道作爲代碼使用不是問題在其他測試和正常工作和它只是混亂的問題)

按照要求:

public TaskService GetTarget() 
{ 
    return new TaskService(_taskRepository.Object); 
} 
+0

顯示'GetTarget()'的代碼? – Haney

+0

@DavidH這只是創建一個存儲庫(已被模擬)的類的實例。我已經加入了這個問題,但我懷疑它會影響這個問題。 – XN16

回答

4

我認爲你應該做的:

_taskInstanceRepository 
    .Setup(x => x.Get(It.IsAny<Expression<Func<TaskInstance, bool>>>(), null, "")) 
    .Returns(_domainTaskInstances); 

您測試的方法不給null作爲第一個參數filter,它給出Expression<...>的一些實例。

顯然,您不能在Setup表達式中省略可選參數;因此代碼:

_taskInstanceRepository 
    .Setup(x => x.Get(It.IsAny<Expression<Func<TaskInstance, bool>>>())) // illegal 
    .Returns(_domainTaskInstances); 

這會顯得有點更像是在你測試方法的語法,是不允許的。

+1

完美的作品謝謝你!不幸的是我認爲你需要把可選參數放在其中,否則它會給你一個錯誤:_An表達式樹可能不包含使用可選arguments_的調用或調用。 – XN16

+0

@ XN16感謝您提供這方面的信息。我更新了答案。 –