gpt4 book ai didi

c# - 使用 Moq 和 xUnit 对服务进行单元测试

转载 作者:行者123 更新时间:2023-11-30 22:56:46 26 4
gpt4 key购买 nike

抱歉,这可能是一个非常业余的问题,但我正在努力了解如何正确使用 Moq。作为一个整体,我对单元测试还很陌生,但我想我开始掌握了它。

所以这是我的问题...我有下面的代码片段,它在 Visual Studio 中使用 TestServer,我将其用于单元测试...我正在尝试模拟 IGamesByPublisher 以便我的测试不依赖于存储库中的数据(或者模拟 GamesByPublisher 会更好吗?...或者我是否需要两者都做?)

public static TestServerWithRepositoryService => new TestServer(services =>
{
services.AddScoped<IGamesByPublisher, GamesByPublisher();
}).AddAuthorization("fake.account", null);


[Fact] // 200 - Response, Happy Path
public async Task GamesByPublisher_GamesByPublisherLookup_ValidRequestData_Produces200()
{

// Arrange
var server = ServerWithRepositoryService;

// Act
var response = await server.GetAsync(Uri);

// Assert
Assert.NotNull(response);
Assert.Equal(HttpStatusCode.OK, response.StatusCode);

}

这是IGamesByPublisher

public interface IGamesByPublisher interface.
{
Task<IEnumerable<Publisher>> Execute(GamesByPublisherQueryOptions options);
}
}

我试过了

public static TestServerWithRepositoryService => new TestServer(services =>
{
services.AddScoped<Mock<IGamesByPublisher>, Mock<GamesByPublisher>>();
}).AddAuthorization("fake.account", null);

然后我尝试了

// Not exactly what I attempted, but that code is long gone... 
var mock = new Mock<IGamesByPublisher >();
var foo = new GamesByPublisherQueryOptions();
mock.Setup(x => x.Execute(foo)).Returns(true);

我并没有真正找到关于使用 Moq 的优秀文档,只是 GitHub 上的快速入门指南,我不确定如何应用(可能是我自己的经验水平有问题...)。

我显然缺少一些使用 Moq 的基础知识......

最佳答案

你很接近。

public static TestServerWithRepositoryService => new TestServer(services => {
var mock = new Mock<IGamesByPublisher>();

var publishers = new List<Publisher>() {
//...populate as needed
};

mock
.Setup(_ => _.Execute(It.IsAny<GamesByPublisherQueryOptions>()))
.ReturnsAsync(() => publishers);
services.RemoveAll<IGamesByPublisher>();
services.AddScoped<IGamesByPublisher>(sp => mock.Object);
}).AddAuthorization("fake.account", null);

以上代码创建了模拟,设置了它的预期行为以在任何时候使用 GamesByPublisherQueryOptions 调用 Execute 时返回发布者列表。

然后它会删除所需接口(interface)的所有注册以避免冲突,然后注册服务以在任何时候请求解析接口(interface)时返回模拟。

关于c# - 使用 Moq 和 xUnit 对服务进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54165639/

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