我尝试使用 SetupSequence
Moq 4.5框架的方法。
应该模拟的类:
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;
});
然后我得到了错误:
Error CS0411 The type arguments for method
'SequenceExtensions.SetupSequence<TMock, TResult>(Mock<TMock>, Expression<Func<TMock, TResult>>)'
cannot be inferred from the usage.
Try specifying the type arguments explicitly.
我在这里找到了可能的解决方案 - SetupSequence in Moq .但它看起来像是一种解决方法。
最佳答案
SetupSequence 用于根据尝试使用正在设置的方法的次数来设置返回序列。基于您的代码的示例演示了我在说什么:
outputManagerMock.SetupSequence(o => o.WriteMessage(It.IsAny<string>()))
.Returns("Hello for the first attempt!")
.Returns("This is the second attempt to access me!")
.Throws(new Exception());
关于c# - Moq SetupSequence 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39719702/