2014-03-31 168 views
1

我正在做單元測試(C#),我有一些返回void的方法。我想知道什麼是模擬這些方法的最佳方法?如何測試返回void的方法?

下面是一段代碼: -

public void DeleteProduct(int pId) 
{ 
     _productDal.DeleteProduct(pId); 
} 
+0

你不 '假' 的單元的方法,你想測試。儘管你可能需要嘲笑它的一些依賴。 – haim770

+0

可能重複的[單元測試無效方法?](http://stackoverflow.com/questions/246038/unit-testing-void-methods) –

回答

2

您可以測試的是使用正確的參數調用ProductDAL.DeleteProduct。 這可以通過使用依賴注入和嘲笑來完成!

樣品使用Moq作爲嘲諷的框架:

public interface IProductDal 
{ 
    void DeleteProduct(int id); 
} 

public class MyService 
{ 
    private IProductDal _productDal; 

    public MyService(IProductDal productDal) 
    { 
     if (productDal == null) { throw new ArgumentNullException("productDal"); } 
     _productDal = productDal; 
    } 

    public void DeleteProduct(int id) 
    { 
     _productDal.DeleteProduct(id); 
    } 
} 

單元測試

[TestMethod] 
public void DeleteProduct_ValidProductId_DeletedProductInDAL() 
{ 
    var productId = 35; 

    //arrange 
    var mockProductDal = new Mock<IProductDal>(); 
    var sut = new MyService(mockProductDal.Object); 

    //act 
    sut.DeleteProduct(productId); 

    //assert 
    //verify that product dal was called with the correct parameter 
    mockProductDal.Verify(i => i.DeleteProduct(productId)); 
} 
2

假設你可以模擬現場_productDal,你要測試是否與相應的pId記錄/對象實際被刪除。

如果您在班級中注入_productDal,可以實現模擬,例如使用constructor injection

+0

我會說它是非常糟糕的做法嘲笑像數據庫的依賴關係! – Neel

+1

@Neel爲什麼呢?嘲笑是你只爲測試目的而做的事情。如果你想**測試**這個方法,然後看看方法的主體,並得出結論,它只是'轉發'到'_productDal'字段,那麼你所要測試的就是' _productDal'實際上正在接聽電話。你可以驗證你是否**嘲笑那個對象。 – Maarten

+0

@嘲笑它只是爲了不可測試的依賴,比如文件系統,數據庫等等。 – InferOn