2009-05-28 54 views
2

我開始使用起訂量,我無法弄清楚如何測試方法在下面的代碼執行用Moq在一個函數內嘲弄一個數據源的連接?

我有下面的類:

public class MyObject { 
    private IDataReaderPlugin m_source; 
    private IDataWriterPlugin m_dest; 
    private string[] m_dummyTags = new string[] { "tag1", "tag2", "tag3"}; 

    public void Execute(DateTime time) 
    { 
     DataCollection tags = m_source.SnapshotUtc(m_dummyTags, time); 

     //Doing some treatment on the values in tags  

     m_dest.Write(tags); 
    } 

}

另一個方法負責根據配置文件中的信息創建並初始化IDataReaderPlugin和IDataWriterPlugin。

我想測試方法執行。所以,我需要模擬m_sourcem_dest後我想測試結果發送到m_dest

我如何用Moq實現這一點?

謝謝。

回答

2

這應該讓你開始:

DateTime myDate = DateTime.Now; 

DataCollection tags = new DataCollection(); 

Mock<IDataReaderPlugin> dataReaderPlugin = new Mock<IDataWriterPlugin>(); 
dataReaderPlugin.Setup(drp => drp.SnapshotUtc(It.IsAny<string[]>(), myDate)).Returns(tags); 

Mock<IDataWriterPlugin> dataWriterPlugin = new Mock<IDataWriterPlugin>(); 
dataWriterPlugin.Setup(dwp => dwp.Write(tags);  

MyObject mo = new MyObject(); 
mo.Execute(); 

mock.Verify(foo => foo.Write(tags)); 
+0

據我所知,你實際上做不到它.IsAny ()...我從來沒有找到一個很好的解決方法:/ – womp 2009-05-28 17:25:48

+0

是的,答案來自我的記憶。您應該可以創建一個虛擬字符串[],然後將其傳入。 – rball 2009-05-28 17:30:55

2

「另一種方法是負責的」 - 這是信息的關鍵位。如果您使用的是IoC或DI框架,那麼您需要插入接口IDataReaderPluginIDataWriterPlugin的一些Moq模擬。然後Execute方法將使用IoC/DI框架提供的這些模擬。

如果他們僅僅是通過一個設置或屬性設置那麼它的那樣簡單:

// Arrange 
var mo = new MyObject(); 
var srcMock = new Mock<IDataReaderPlugin>(); 
src.Setup(src => src.SnapshotUtc(It.IsAny<string[]>(), It.IsAny<DateTime>())) 
    .Returns(new DataCollection() /* or whatever */); 
mo.SetSource(srcMock.Object); 
// ... same for m_dest 
// Act 
mo.Execute(DateTime.Now); 
// Assert 
// assert something... srcMock.Verify() or whatever 
+0

不幸的是,如何在類的設計,這兩個接口是在類內創建的,所以我不能注入模擬接口。 – 2009-05-28 17:39:35

4
[Test] 
public void ShouldWriteToMDest() 
{ 
    // Arrange 
    var mockDest = new Mock<IDataWriterPlugin>(); 
    var mockSource = new Mock<IDataReaderPlugin>(); 
    string[] m_dummyTags = new string[] { "tag1", "tag2", "tag3"}; 

    mockSource.Setup(source => source.SnapshotUtc(m_dummyTags, It.IsAny<DateTime>()).Returns(/*whatever you need*/); 

    var myObj = new MyObject(mockSource.Object, mockDest.Object); 

    // Act 
    myObj.Execute(DateTime.Now); 


    // Assert 
    Assert.That(mockSource.Object.WhateverPropertyContainsOutput == /*Whatever you need */); 

} 
+0

就目前而言,除非您可以將接口類注入到MyClass中,否則它無法檢測,因爲您的類將創建它們。你需要使用像我在代碼示例中顯示的構造函數來注入依賴關係。 – womp 2009-05-28 17:24:50