我試圖用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);
}
顯示'GetTarget()'的代碼? – Haney
@DavidH這只是創建一個存儲庫(已被模擬)的類的實例。我已經加入了這個問題,但我懷疑它會影響這個問題。 – XN16