4

嗨,我想创建一个模拟对象,每次调用 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);
4

1 回答 1

11

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

事实上,您可以通过消除Callback和只是做来缩短您的代码.Returns(() => fileSharePath += ++i)。您应该很少需要同时使用Callback Returns用于单个功能。 Callback“模拟执行”一个void函数,Return“模拟执行”一个带有返回值的函数,然后返回该值。

于 2013-09-02T13:34:44.537 回答