簡體   English   中英

用Func模擬存儲庫調用 <T, bool> Moq參數

[英]Mocking a repository call with a Func<T, bool> parameter using 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所看到的_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);
}

我認為您應該這樣做:

_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);

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM