2013-08-01 233 views
0

我有一個無效方法,我需要進行單元測試,可以有一個人請幫助我該怎麼辦呢MS測試爲void的方法

[TestMethod()] 
public void ProcessProductFeedTest() 
{ 
    // TODO: Initialize to an appropriate value 
    ProductDataServiceProvider target = new ProductDataServiceProvider(); 

    target.ProcessProductFeed(); 
    Assert.Inconclusive("A method that does not return a value cannot be verified."); 
} 
在上面的代碼ProcessProductFeed(

)是無效該方法從SQL Server數據庫獲取一些數據,併發布到TIBCO,我怎麼能寫一個單元測試的情況下對同一

回答

3

那麼,你應該測試數據被髮布到TIBCO,基本上是這樣。

對於任何方法,如果主要目的是計算某些東西,或者如果這是方法的主要目的,那麼測試應該測試返回的值是否正確。 (您然後測試錯誤條件好,當然)。

無需瞭解任何TIBCO或者你的架構什麼,我真的不能在你如何去測試公佈部分評論。我會親自分開閱讀,處理和發佈的三個階段 - 然後每個部分都可以與其他部分隔離測試。

+0

強調應該對每個組件進行單獨測試。一勞永逸測試整個事情是非常危險的,因爲這意味着業務中的邏輯錯誤可能被其他層所掩蓋。 – Mgetz

+0

一起測試所有組件將是一個集成測試,而不是單元測試。 – Romoku

+0

@Romoku我知道,但人們常常忘記和不喜歡的東西[測試MOQ(http://stackoverflow.com/questions/15062403/moq-testing-void-method?rq=1) – Mgetz

3

摘要持久性和TIBCO通信從你的類。例如。你可以使用一些倉庫接口用於與SQL服務器:

public interface IProductsRepository 
{ 
    IEnumerable<Product> GetSomeProducts(); 
    // other members 
} 

而一些網關與TIBCO通信電子(我把它命名爲股票,但你應該提供企業的具體名稱):

public interface IStockGateway 
{ 
    void DoSomethingWithProducts(IEnumerable<Product> products); 
    // other members 
} 

然後使你的班級依賴於這些抽象。你將能夠嘲笑他們並驗證課堂行爲:

public class ProductDataServiceProvider 
{ 
    private IProductsRepository _productRepository; 
    private IStockGateway _stockGateway; 

    // inject implementations 
    public ProductDataServiceProvider(
     IProductRepository productRepository, 
     IStockGateway stockGateway) 
    { 
     _productRepository = productRepository; 
     _stockGateway = stockGateway; 
    } 

    public void ProcessProductFeed() 
    { 
      // use repository and gateway 
    } 
} 

現在,回到測試。什麼是你的提供者的責任 - 從產品倉庫獲得一些產品(這個倉庫的實現將從SQL數據庫加載產品)並將它們傳遞給網關(網關的實現將把產品發佈到TIBCO)。這裏是使用Moq庫的測試:

[TestMethod] 
public void ShouldPassSomeProjectToStock() 
{ 
    // Arrange 
    var products = new List<Product>() { }; // create some products 
    var mockRepository = new Mock<IProductRepository>(); 
    mockRepository.Setup(r => r.GetSomeProducts()).Returns(products); 

    var mockGateway = new Mock<IStockGateway>(); 
    mockGateway.Setup(g => g.DoSomethingWithProducts(products)); 

    var provider = new ProductDataServiceProvider(mockRepository.Object, 
                ockGateway.Object); 
    // Act 
    provider.ProcessProductFeed(); 
    // Assert 
    mockRepository.VerifyAll(); // verify products retrieved from repository 
    mockGateway.VerifyAll(); // verify products passed to gateway 
} 
+1

偉大的回答,真的很好的解釋 – CSharped

+0

@CSharped謝謝:)一兩件事 - 有兩種測試方法 - 基於狀態的測試,鍛鍊之後驗證系統的狀態(即公共屬性,返回的結果),和交互爲基礎的測試,驗證如何你的對象與它的依賴進行通信。我建議你閱讀福勒的文章[Mocks Are Not Stubs](http://www.martinfowler.com/articles/mocksArentStubs.html)以更好地理解這些不同的方法 –

+0

@CSharped也記住,測試應該是[ FIRST](http://pragprog.com/magazines/2012-01/unit-tests-are-first)這意味着當單元測試提供者不應該使用真正的數據庫或TIBCO –