2015-04-01 60 views
1

在我的控制器操作的方法,每當添加新產品,我檢查數據庫中,該產品沒有任何已不存在。此檢查的代碼看起來像如何寫起訂量測試設置返回計數值

public ActionResult Index(ProductModel model) 
    { 
     var productCount = _productsService.GetAll(true).Count(x => x.ProductNumber == model.ProductNumber); 

     if (productCount > 0) 
      ModelState.AddModelError("ProductNumber", Product already present in the system!"); 

     // more processing 
    } 

我新來起訂量測試,並試圖寫一個單元測試來設置GETALL方法,該方法將返回0。我寫了這樣的事情,但它似乎不工作

var _productsService = new Mock<IProductsService>(); 
_productsService.Setup(m => m.GetAll(true).Count()).Returns(0); 

任何想法?感謝

+0

到底是什麼,你要測試的功能?控制器方法或_productsService.GetAll()? – greenhoorn 2015-04-01 11:16:23

+0

@greenhoorn我想測試控制器的行爲,但在這個動作中,我調用GetAll方法,我需要設置它並獲得一個值。 – rumi 2015-04-01 11:19:18

+0

您是否收到錯誤? – greenhoorn 2015-04-01 11:23:08

回答

1

這不是你如何使用最小起訂量 - Count是很可能不是你的方法(這是LINQ /其他第三方),你不要嘲笑它。你需要嘲笑的是GetAll方法,這是你可嘲笑依賴的方法。你「告訴」 GetAll返回產品與模型參數匹配,像這樣:

[Test] 
public void Index_ReportsModelError_WhenProductAlreadyExists() 
{ 
    const int ExistingProductNumber = 10; 
    var _productsService = new Mock<IProductsService>(); 
    var existingProduct = new Product { ProductNumber = ExistingProductNumber }; 
    _productsService.Setup(m => m.GetAll(true)).Returns(new [] { existingProduct }); 

    controller.Index(new ProductModel { ProductNumber = ExistingProductNumber }); 

    // Assert 
} 

修復現有的測試是爲確保GetAll永遠不會返回產品一樣,一個在Index參數號一樣簡單:

const int ExistingProductNumber = 10; 
const int NewProductNumber = 20; 
var _productsService = new Mock<IProductsService>(); 
var existingProduct = new Product { ProductNumber = ExistingProductNumber }; 
_productsService.Setup(m => m.GetAll(true)).Returns(new [] { existingProduct }); 

controller.Index(new ProductModel { ProductNumber = NewProductNumber }); 

// Assert 
+0

我正在處理其他一些測試代碼。我必須在控制器操作中添加此檢查(即產品編號不存在),並且現在這些單元測試由於此更改而失敗。我現在試圖弄清楚如何通過'這個GetAll檢查的添加並在ModelState中添加這個錯誤'。我想設置類似這樣的代碼,通過在添加此檢查之前寫入的單元測試中傳遞此代碼。當然,我也可以添加一個新的單元測試,以檢查存儲庫上的GetAll方法。 – rumi 2015-04-01 11:51:14

+0

@Learner:*「是的肯定,我可以添加一個新的單元測試過檢查GETALL方法對信息庫」 * - 爲什麼要這麼做?你測試控制器,而不是'GetAll'。 GetAll是依賴於你的控制器,你存根(如你現在所做的那樣)。你提到你添加了**新功能**,打破了測試。這需要在測試中進行更改 - 您需要確保'GetAll'的現有設置永遠不會返回與傳遞給'Index'方法相同數量的產品。 – 2015-04-01 11:56:08

+0

謝謝@ jimmy_keen你已經澄清了我的概念。任何關於在線優秀教程的建議,或使用存儲庫進行Moq測試的書籍或視頻? – rumi 2015-04-01 12:21:56