2011-07-26 60 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