gpt4 book ai didi

c# - 无法为接口(interface)模拟传递构造函数参数(Mock IFeedResponse)

转载 作者:太空宇宙 更新时间:2023-11-03 20:54:40 25 4
gpt4 key购买 nike

我正在尝试为 DocumentDBRepository 编写单元测试分页代码。由于 FeedResponse 涉及到延续 token ,我需要模拟 FeedResponse为了给 FeedResponse.ContinuationToken 赋予一些值(value)。但问题是我收到一条错误消息:

Message: System.ArgumentException : Constructor arguments cannot be passed for interface mocks.

这是否意味着我无法 mock FeedResponse ?或者也许是我使用 FeedResponse 的方式有错吗?

这是我的代码:

var response = new Mock<IFeedResponse<T>>(expected);
response.Setup(_ => _.ResponseContinuation).Returns(It.IsAny<string>());
var mockDocumentQuery = new Mock<IFakeDocumentQuery<T>>();

mockDocumentQuery
.SetupSequence(_ => _.HasMoreResults)
.Returns(true)
.Returns(false);

mockDocumentQuery
.Setup(_ => _.ExecuteNextAsync<T>(It.IsAny<CancellationToken>()))
.Returns((Task<FeedResponse<T>>)response.Object);

当我调试时,断点停在 var response = new Mock<IFeedResponse<T>>(expected);然后错误发生了。

最佳答案

该错误是因为您正在模拟接口(interface)并尝试传递构造函数参数。正如错误消息所述,这不会起作用。

但是,您可以使用 FeedResponse 的实际实例。

鉴于所需成员不是 virtual并且也是只读的,您可以考虑对类进行 stub 并覆盖自 FeedResponse<T> 以来的默认行为不是sealed .

例如

public class FeedResponseStub<T> : FeedResponse<T> {
private string token;

public FeedResponseStub(IEnumerable<T> result, string token)
: base(result) {
this.token = token;
}

public new string ResponseContinuation {
get {
return token;
}
}
}

并在测试中使用 stub

//...

var token = ".....";
var response = new FeedResponseStub<T>(expected, token);

//...

mockDocumentQuery
.Setup(_ => _.ExecuteNextAsync<T>(It.IsAny<CancellationToken>()))
.ReturnsAsync(response);

//...

关于c# - 无法为接口(interface)模拟传递构造函数参数(Mock IFeedResponse),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51736363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com