2013-09-27 39 views
0

我已經得到了下面的單元測試,它們使用Moq並且它們編譯並給了我正確的結果,但是我不相信我已經正確地實現了它們,或者如果我有,那麼我誤解了Moq在這種情況下正在做的事情。下面的Moq單元測試是否正確組合

這裏是我的單元測試:

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

[TestMethod()] 
public void TaskService_CheckForTaskUsage_Success() 
{ 
    _taskInstanceRepository.Setup(x => x.Get(It.IsAny<Expression<Func< 
     TaskInstance, bool>>>(), null, "")).Returns(_domainTaskInstances); 

    int taskId = 1; 
    bool expected = true; 
    bool actual; 
    actual = GetTarget().CheckForTaskUsage(taskId); 
    Assert.AreEqual(expected, actual); 
} 

[TestMethod()] 
public void TaskService_CheckForTaskUsage_Failure() 
{ 
    _taskInstanceRepository.Setup(x => x.Get(It.IsAny<Expression<Func< 
     TaskInstance, bool>>>(), null, "")).Returns(new List<TaskInstance>() 
     .AsEnumerable()); 

    int taskId = 2; 
    bool expected = false; 
    bool actual; 
    actual = GetTarget().CheckForTaskUsage(taskId); 
    Assert.AreEqual(expected, actual); 
} 

,我檢查的方法是這樣的:

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

,我嘲笑的方法是這樣的:

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

GetTarget()方法創建方法所在類的實例,而_taskInstanceRepository已設置。

我有的困惑是.Returns()部分模擬Get()方法在存儲庫中。我不知道是否按照我所做的那樣設置返回值是正確的,因爲從我的角度來看,它似乎並不會實際執行Get()方法以及傳遞給它的表達式。然而,這可能是正確的,因爲我不試圖執行Get()方法,只返回一些值,但如果是這種情況,爲什麼我會關心發送到它的可能參數?

感謝

+1

這可能屬於[代碼評論](http://codereview.stackexchange.com/users/15330/)。 –

+0

'Returns'對我來說看起來很好。但是,如果'Get()'返回'null',你可能想添加一個測試。 :) –

回答

2

從我的角度來看,這似乎並不像它實際上將執行 的get()方法,並傳遞到它的表達。

這是正確的 - 它不會真正從數據庫中獲取數據。單元測試應測試邏輯而不是數據庫連接。

爲什麼我會關心發送到它的可能參數?

例如,如果某些參數引發異常或返回null,您可以測試。例如,-1可能會引發異常。在這種情況下,你會想要測試。

還要注意其他Assert選項,如Assert.IsTrue,這可能更合適。

+0

非常感謝您的澄清!至於'Assert',我同意,它們只是測試中的標準VS生成的標準,然後纔將其更改爲更合理的方法! – XN16