调用回调时,Moq回调值不会更改

时间:2013-09-02 13:22:19

标签: c# unit-testing moq

您好我创建了一个模拟对象,每次调用GetPath方法时我都会迭代。 这是我的单元测试代码:

string fileSharePath = "/fileSharePath/";
int i = 0;
m_FileShareDocumentPathProvider.Setup(p => p.GetPath(It.IsAny<IFileShareDocument>()))                                    
                               .Callback(() =>
                                   {
                                       i++;
                                       fileSharePath += i;
                                   })
                               .Returns(fileSharePath);

以下是女巫GetPath获取的代码:

foreach (var document in documents)
{
     string filePath = GetFilePath(document);
     fileSharePaths.Add(filePath);
     documentsDictionary.Add(document, filePath);
}

private string GetFilePath(IFileShareDocument document)
{
     var fileShareDocumentPathProvider = m_FileShareDocumentPathProviderFactory.GetFilePathProvider(document);
     var filePath = fileShareDocumentPathProvider.GetPath(document);
     return filePath;
}

调试时我注意到fileSharePath的值没有按预期变化,但它保持不变。

我做错了什么?

修改

  m_FileShareDocumentPathProviderFactory.Setup(f => f.GetFilePathProvider(It.IsAny<IFileShareDocument>()))
                                              .Returns(m_FileShareDocumentPathProvider.Object);

1 个答案:

答案 0 :(得分:8)

您需要将Returns(fileSharePath)更改为Returns(()=>fileSharePath)。当您致电Returns时,它会按值传递fileSharePath,因此该值永远不会更改。您必须将其作为委托传递,这会导致Moq在每次“返回”该值时执行该函数。

事实上,您可以通过取消Callback并执行.Returns(() => fileSharePath += ++i)来缩短代码。您应该很少需要同时使用Callback Returns作为单个函数。 Callback“mock执行”void函数,Return“mock执行”带返回值的函数,然后返回该值。