问题标签 [pact-net]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
623 浏览

c# - PactNet - 如何在同一个测试运行中运行多个 Pact json?

我通过使用单个 .json 文件测试基本 API 交互的教程开始学习 Pact。现在我想通过将 PACT 拆分为多个 JSON 文件来开始组织我的 PACT。

设置 Pact 验证程序时,是否可以将 PactUri 指定为文件夹路径而不是 JSON 的路径?

这是我的验证者最初的样子:

我了解以下内容无法正常工作,因为 PactUri() 需要文件 uri。

0 投票
1 回答
633 浏览

dependency-injection - 如何从另一个程序集配置 Asp.Net 核心 WebAPI 中的服务

在微服务环境中,我需要为基于契约的测试构建一个框架。我目前正在研究如何将单个服务与其外部依赖项隔离开来,以便执行 Provider 测试。

我需要做的是:

  • 保持 WebApi 项目完好无损
  • 使用一些配置差异启动 WepApi 的实例
  • 模拟选定的依赖项

我的解决方案结构是这样的:

我已阅读有关 dotnet 中的 Pact Tests 的本指南。专注于Case.Pace.ProviderTest,我需要以Case.Api编程方式从Case.Pact.ProviderTest(以及另一个用于 Pact it self 的 WebHost)开始并替换它的一些依赖项。

到目前为止,我得到了这个:

在包含的行中,.UseStartup<CaseStartup>()我只是简单地复制Startup.csCase.Api更改了所需的依赖项,效果很好。

但我想要一个更通用的解决方案。仅仅复制代码并称之为一天是不对的:),因为它不是通用的,也不能用于其他服务。

所以我一直在挖掘,并想出了以下内容。

从我意识到的其他程序集中添加控制器
,使用来自不同程序集的 StartUp 启动 IWebhost 不会自动从该程序集中添加控制器。这需要明确地完成。所以我这样做了:

惊人的!!!到目前为止,一切都很好。

下一期:

替换依赖:
reding这篇文章,我创建了替换依赖的扩展方法:

所以我可以像这样替换我想要的依赖项:(在本例中为 QueryHandler)

但这并不能解决我复制代码的问题。

我的梦想是能够使用Startup.csfromCase.Api并以某种方式调整 DI 以替换依赖项,而无需所有冗余代码。

任何输入都会受到高度评价。
谢谢 :)

0 投票
1 回答
160 浏览

functional-testing - 我可以使用 Pact 代理进行功能测试吗?

我有一个接收请求、生成电子邮件、将电子邮件保存到消息队列(由其他微服务发送)并返回 httpStatus.Ok 的服务。我想测试是否会针对不同的请求生成相关的电子邮件。

根据合同测试与功能测试 ,我的测试是功能性的,而不是合同测试。(如果我的服务会将电子邮件内容作为 api 响应返回,那么使用 Pact 进行合同测试肯定是合适的)。

我有一个使用 Pact 基础设施进行此类功能测试的想法,特别是
1.将请求和预期生成的电子邮件保存到 Pact Broker
2.在提供者验证测试中提交请求并使用预期的电子邮件验证生成的电子邮件。

在这样的功能测试中使用 Pact 有意义吗?
有谁知道类似用法的例子?
任何替代技术(最好在 .Net Core 中)进行类似测试?

我也在考虑 https://github.com/approvals/ApprovalTests.Net,但 Pact 基础设施更吸引我。

相关说明:Pact 通常适用于 http 请求/响应,但 Pact V3(尚未由 PackNet实现)为通过事件流和消息队列进行通信的服务引入了消息。一个描述消息协定合同测试的示例是 https://dius.com.au/2017/09/22/contract-testing-serverless-and-asynchronous-applications/Pact 为 MessageQueue 引用的:MessageQueues 的示例提供程序测试

0 投票
2 回答
265 浏览

c# - PactNet 合同测试失败并出现 HttpRequestException 和 SocketException

我正在尝试使用PactNet以下方法编写合同测试:

我创建了以下内容并将ConsumerPactTests.cs用作指南。ConsumerPactClassFixture.cs

当我运行测试时,我收到此错误:

dotnet test --filter "FullyQualifiedName=Bond.Publisher.Tests.ContractTest.ConsumerPactTests.ItHandlesInvalidDateParam"

测试运行 c:\Workspace\prod\test\Bond.Publisher.Tests\bin\Debug\netcoreapp3.1\Bond.Publisher.Tests.dll(.NETCoreApp,Version=v3.1) Microsoft (R) 测试执行命令Line Tool 版本 16.7.0 版权所有 (c) Microsoft Corporation。版权所有。

开始测试执行,请稍候...

共有 1 个测试文件与指定的模式匹配。[xUnit.net 00:00:10.95] Bond.Publisher.Tests.ContractTest.ConsumerPactTests.ItHandlesInvalidDateParam [失败] X Bond.Publisher.Tests.ContractTest.ConsumerPactTests.ItHandlesInvalidDateParam [4s 196ms] 错误消息:System.Net.Http.HttpRequestException : 无法连接,因为目标机器主动拒绝。---- System.Net.Sockets.SocketException : 由于目标机器主动拒绝,无法建立连接。堆栈跟踪:在 System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean allowHttp2, CancellationToken cancellationToken) 在 System.Net.Http 的 System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancelToken)。 HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage 请求,

试运行失败。

我怀疑这可能是某种身份验证问题UnoAuthorisationHeaderMessageHandler.cs。我做错了什么?

0 投票
1 回答
36 浏览

c# - 自定义 pactnet 合约文件名

在我的pactnet消费者测试中,我将合同声明如下:

生成合同文件时,它具有以下名称:my.consumer.application-my.provicer.application.json. 是否可以自定义它以使其显示为My.Consumer.Application.My.Provicer.Application.json

0 投票
0 回答
150 浏览

c# - 如何生成协议/合同,指定仅应验证响应中属性的存在和类型?

我已经使用从模型类初始化的空对象设置了BodyProviderServiceResponse而不是使用匿名对象设置它,因为我想重用模型类并尽可能少地做。现在,我正在尝试生成一个协议/合同,指定只验证响应正文中属性的类型和存在,而不是其确切值。

我已经做了相当多的工作,但是当模型的属性为 String 类型时,Provider 端的验证似乎总是会失败(请参阅此问题的底部)。

我可以知道如何解决这个问题吗?

这是我到目前为止所拥有的:


模型类:用户

消费者测试代码:

提供者测试代码:

当我运行 Provider 测试时,我遇到了这个错误:

解决方法

使用 AutoBogus 或类似工具在模型对象用于创建契约之前自动设置具有适当值的模型对象的属性。如果一切都失败了,那么这将是我要探索的解决方案。

0 投票
2 回答
150 浏览

testing - Pact.net 合同协议文件未在指定目录中创建,尽管测试通过

这是我的 Pact 类的样子,您可以看到 PactDir 已指定。当测试通过时,它只创建日志文件夹/文件,而不是契约合约。

这就是测试文件的样子。使用 nUnit 框架。

0 投票
2 回答
99 浏览

pact - PACT - 处理提供者服务状态并使用模拟或实际数据库运行实际提供者

我是 PACT 的新手,正在尝试使用 pact-net 进行 .net 微服务的合同测试。我了解生成协议文件的消费者测试的概念。提供者状态中间件的概念负责确保提供者的状态与生成的契约中的 Given() 条件匹配。我对以下内容或如何实现这一点有点困惑:

提供者测试针对实际服务运行。所以我们在运行测试之前启动提供者服务。我的提供者服务与数据库交互以存储和检索记录。PACT 还提到应该对服务的所有依赖项进行存根。

  1. 所以我们运行针对实际数据库运行的实际提供程序 api?
  2. 如果我们针对实际数据库运行 api,我们如何将数据注入数据库?我们是否应该使用提供者 api 自己的端点来添加 Given() 数据?
  3. 如果以上不是正确的方法,那是什么?

我遇到的所有基本博客文章都没有解释这一点,并且通常有没有提供者状态或只是文件系统上的一些文本文件的状态的示例。

帮助表示赞赏。