【发布时间】:2011-07-26 17:36:30
【问题描述】:
情况就是这样。我有异步调用,所以我需要为此设置中间层以便能够对其进行测试。
request.BeginGetResponse(new AsyncCallback(LoginCallback), requestState);
所以,为了能够在没有真正请求的情况下进行测试,我创建了可以模拟的接口。
public interface IRequestSender
{
void Send(HttpWebRequest request, AsyncCallback internalCallback, object requestState);
}
然后在实现中我可以使用上述调用,并且我可以提供一些模拟类来调用我的回调方法,无论请求是否有效。我的模拟类是这样的。
public class RequestSenderMock : IRequestSender
{
public void Send(HttpWebRequest request, AsyncCallback internalCallback, object requestState)
{
var result = new Mock<IAsyncResult>();
result.Setup(x => x.AsyncState).Returns(requestState);
internalCallback(result.Object);
}
}
我现在可以轻松地在我的单元测试中创建模拟对象并使用它。但是当我创建时
var sender = new Mock<RequestSenderMock>();
我无法验证此对象的调用次数。
sender.Verify(x => x.Send(It.IsAny<HttpWebRequest>(), It.IsAny<AsyncCallback>(), It.IsAny<object>()), Times.Once());
它说我的方法需要是虚拟的。 有没有办法在不使我的方法虚拟化的情况下做到这一点?如果我能在使用接口时以某种方式指定方法实现,那将是最好的。
var sender = new Mock<IRequestSender>();
并且以某种方式使用 Setup 方法或其他方法在此模拟对象上实现。比我简单地删除我的模拟课程。 这可能吗?你有什么建议?
【问题讨论】: