您好我创建了一个模拟对象,每次调用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);
答案 0 :(得分:8)
您需要将Returns(fileSharePath)
更改为Returns(()=>fileSharePath)
。当您致电Returns
时,它会按值传递fileSharePath
,因此该值永远不会更改。您必须将其作为委托传递,这会导致Moq在每次“返回”该值时执行该函数。
事实上,您可以通过取消Callback
并执行.Returns(() => fileSharePath += ++i)
来缩短代码。您应该很少需要同时使用Callback
和 Returns
作为单个函数。 Callback
“mock执行”void
函数,Return
“mock执行”带返回值的函数,然后返回该值。