我尝试使用Moq 4.5框架的SetupSequence
方法。
需要被模拟的类:
public class OutputManager {
public virtual string WriteMessage(string message) {
// write a message
}
}
模拟:
var outputManagerMock = new Mock<OutputManager>();
var writeMessageCalls = 0;
var currentMessage = String.Empty;
outputManagerMock.Setup(o => o.WriteMessage(It.IsAny<string>())).Callback((string m) => {
writeMessageCalls++;
message = m;
});
这段代码运行良好。但我希望每次调用WriteMessage
方法时都有不同的设置。那么,我会使用SetupSequence
而不是Setup
:
var outputManagerMock = new Mock<OutputManager>();
var writeMessageCalls = 0;
var firstMessage = String.Empty;
var secondMessage = String.Empty;
outputManagerMock.SetupSequence(o => o.WriteMessage(It.IsAny<string>()))
.Callback((string m) => {
writeMessageCalls++;
firstMessage = m;
}).Callback((string m) => {
writeMessageCalls++;
secondMessage = m;
});
然后我遇到了错误:
错误 CS0411:无法从使用中推断出方法 'SequenceExtensions.SetupSequence(Mock,Expression>)' 的类型参数。请尝试显式指定类型参数。
我在这里找到了可能的解决方案 - Moq中的SetupSequence。但它看起来像是一个变通方法。
SetupSequence
的代码。 - NkosiWriteMessage
调用使用不同的Callback(...)
。 我已经在我的问题中添加了一段代码。 根据您的答案,我尝试使用接口而不是特定类。 现在它可以工作了。 我的意思是像这样 'var mock = new Mock<IOutputManager>(); mock.SetupSequence()... ' 但似乎我不能在SetupSequence
中使用.Callback()
方法。 只允许使用.Returns()
。 - Sergey