【发布时间】:2017-02-04 19:01:28
【问题描述】:
我尝试使用 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<TMock, TResult>(Mock<TMock>, Expression<Func<TMock, TResult>>)'的类型参数无法从用法中推断出来。
尝试明确指定类型参数。
我在这里找到了可能的解决方案 - SetupSequence in Moq。但这似乎是一种解决方法。
【问题讨论】:
-
显示你实际使用的代码
SetupSequence -
另外,
OutputManager.WriteMessage应该是虚拟的,否则 Moq 会抛出异常。 -
是的,当然是虚拟的。我已经更新了我的代码示例。
-
期望的行为是什么?
-
我想为每个
WriteMessage调用使用不同的Callback(...)。我在我的问题中添加了一段代码。根据您的回答,我尝试使用接口而不是特定类。它现在有效。我的意思是这样的 'var mock = new Mock(); mock.SetupSequence()... ' 但看起来我不能将 '.Callback()' 方法与 SetupSequence一起使用。只允许使用 '.Returns()'。
标签: c# asp.net unit-testing moq