gpt4 book ai didi

c# - 单元测试 : How to return value asynchronously from mocked interface

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

我正在尝试对方法进行单元测试,并在调用处理 HttpClient 逻辑的模拟“请求提供程序”时断言结果属于特定类型,尽管我已经设置了模拟接口(interface),但它始终返回 null。

以前使用 HttpClient 时,我模拟了 HttpMessageHandler 并在另一侧的方法中处理业务逻辑,但是我们使用的第三方 API 需要使用 GET 请求多次调用他们的 rest api,所以我想要一个解决方案这使解决方案更“干燥”

以下是我目前尝试使用的设置

_requestProvider.Setup(
svc => svc.GetAsync<PlayerBalance>(It.IsAny<string>(), It.IsAny<string>()))
.Returns(() => Task.FromResult(new PlayerBalance
{
Balance = 0
}));

_playerService = new PlayerService(_playerRepository.Object,
_secretsService.Object,
_awsConfig,
_requestProvider.Object);

我的行为/主张

var result = await _playerService.GetPlayerBalanceAsync(request);

result.Should().BeOfType<PlayerBalance>();

被测方法

public async Task<PlayerBalance> GetPlayerBalanceAsync(PlayerBalanceRequest playerBalanceRequest)
{
if (string.IsNullOrEmpty(playerBalanceRequest.Login)) throw new Exception("Login is a required parameter.");


string url = $@"myrestendpoint";

var result = await _requestProvider.GetAsync<List<PlayerBalance>>(url);

return result.FirstOrDefault();
}

模拟调用失败的地方

public async Task<TResult> GetAsync<TResult>(string uri, string token = "")
{
HttpClient httpClient = CreateHttpClient(token);
HttpResponseMessage response = await httpClient.GetAsync(uri);

await HandleResponse(response);
string serialized = await response.Content.ReadAsStringAsync();

TResult result = await Task.Run(() =>
JsonConvert.DeserializeObject<TResult>(serialized, _serializerSettings));

return result;
}

在“严格”模式下运行时,它告诉我它需要调用但未找到设置。我不太确定这里还需要设置什么。

从最后一段代码返回的结果总是空的,但我希望它是 PlayerBalance { Balance = 0 }

如有任何帮助,我们将不胜感激。

澄清一下,我还尝试了以下方式进行设置

.Returns(Task.FromResult(new PlayerBalance
{
Balance = 0
}));

.ReturnsAsync(new PlayerBalance {
Balance = 0
});

最佳答案

你在 mock :

_requestProvider.GetAsync<PlayerBalance>(url)

什么时候应该 mock :

_requestProvider.GetAsync<List<PlayerBalance>>(url)

设置模拟以期望期望的行为:

_requestProvider.Setup(
svc => svc.GetAsync<List<PlayerBalance>>(It.IsAny<string>(), It.IsAny<string>())
)
.ReturnsAsync(() => new List<PlayerBalance>() { new PlayerBalance
{
Balance = 0
}});

关于c# - 单元测试 : How to return value asynchronously from mocked interface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54364591/

25 4 0
文章推荐: javascript - 如何使用 Passport 和 nodeJS 在 angularJS 前端显示用户信息
文章推荐: css - 悬停时更改 md-icon 和 md-button
文章推荐: javascript - 我正在开发的 Express/Socket.io 应用程序中的奇怪 JavaScript
文章推荐: javascript - jQuery hide() Then show()