2011-07-26 93 views
2

我很努力地使用moq並驗證傳遞給模擬接口方法的參數。我有這樣一個代碼:moq和參數匹配

MockRepository mockRepository = new MockRepository(MockBehavior.Default); 

Mock<IConfigurationUpdater> workerInstanceMock = mockRepository.Create<IConfigurationUpdater>(); 
Mock<IConfiguration> configurationMock = mockRepository.Create<IConfiguration>(); 

configurationMock.Setup(t => t.Folder).Returns("Folder"); 
configurationMock.Setup(t => t.FileName).Returns("FileName"); 

workerInstanceMock 
    .Setup(
      x => x.DoSomeWork(
       It.Is<string>(
        t => t == Path.Combine(configurationMock.Object.Folder, configurationMock.Object.FileName)))) 
    .Verifiable("DoSomeWork not properly called"); 

    mockRepository.VerifyAll(); 

的問題是,爲內「It.Is」,所產生的拉姆達expresion configurationMock的所有特性(這是先前設定)都爲空。 (如果我將這個「Path.Combine」放入一個字符串中,它將會工作得很好)。 在這種情況下,「Path.Combine」失敗,因爲它收到空參數。

我應該如何正確使用mocks並驗證我的接口是否使用正確的參數進行調用。

感謝, 林

+0

備註只有使用Path.Combine才能獲得此行爲,因爲它看起來在另一個上下文中運行了lamba表達式。使用「It.Is (t => t == savConfigurationMock.Object.LiveUpdateFolder +」\\「+ savConfigurationMock.Object.LiveUpdateMergeConfigFile)」或將其放在屬性中僅用於文件。 – florin

回答

0

我認爲你需要使用起訂量的屬性,將自動開始跟蹤它的值(存根)。

相反的:

configurationMock.Setup(t => t.Folder).Returns("Folder"); 
configurationMock.Setup(t => t.FileName).Returns("FileName"); 

可以使用

configurationMock.SetupProperty(t => t.Folder, "Folder"); 
configurationMock.SetupProperty(t => t.FileName, "FileName"); 

,然後像你一樣訪問屬性:

configurationMock.Object.Folder 

更多關於最小起訂量特性可以在這裏找到:http://code.google.com/p/moq/wiki/QuickStart#Properties

+0

不起作用,它具有相同的行爲:在lambda(It.Is ...)內部,屬性返回null。 – florin

+0

也許這是一個愚蠢的問題,但我會問:Folder和FileName在IConfiguration接口中聲明爲屬性?我的意思是得到;並設置;句法? – Diego

+0

是的(和IConfiguration確實是一個iterface不是一個類:))。最初他們只有吸氣劑,然後在嘗試你的消化時也添加了一個setter(SetupProperty需要一個setter來創建存根)。 – florin