如何对依赖有效 CustomerId 工作的 Stripe 方法进行单元测试

Posted

技术标签:

【中文标题】如何对依赖有效 CustomerId 工作的 Stripe 方法进行单元测试【英文标题】:How to unit test Stripe methods where they rely on a valid CustomerId to work 【发布时间】:2021-11-02 15:03:15 【问题描述】:

我对测试很陌生。

我有一个非常简单的方法,可以创建一个 Stripe 用户并将他们的 Id 附加到他们在 DB 中的 User 对象。

[Fact(DisplayName = "AddStripeCustomerIdAsync should save a StripeId to the User")]
public async Task Test_AddStripeCustomerIdAsync()

  // Arrange
  var customerCreateOptions = new CustomerCreateOptions
  
     Email = "test@test.com"
  ;
            
  // Act
  await _userCustomerService.AddStripeCustomerIdAsync(user, customerCreateOptions);
            
  // Assert
  Assert.False(user.StripeCustomerId.IsNullOrEmpty());

效果很好。然而,许多其他与 Stripe 相关的测试依赖于 StripeCustomerId 字段中存在有效的 Stripe 客户 ID。例如,

[Fact(DisplayName = "AddCardToAccount should add a reference for a card to the user.")]
public async Task Test_AddCardToAccount()

  // Act
  var result = paymentService.AddCardPaymentMethod(
                user, 
                "4242424242424242",
                9, 
                2025,
                "552");

  // Assert
  Assert.True(result);

此测试失败,除非我将真实的 Stripe 客户 ID 硬编码给用户,或者在运行每个使用它的测试之前调用附加 Stripe Id 的函数。

所以我现在有

user = new ApplicationUser

  StripeCustomerId = "cus_ ..."
;

感觉不对。如果该值不是真正的 Stripe customerId,则会到处抛出 Stripe 异常。我做得好吗,这是无法帮助的,还是我错过了什么?

【问题讨论】:

单元测试不应该测试底层数据库。所有外部服务(在被测试的类之外)都应该被模拟。这意味着您可以控制记录是否存在或不在每个测试的范围内。 抱歉,我忘了说我为此使用了一个模拟的 InMemory 数据库 如果没有看到您的被测方法 (paymentService.AddCardPaymentMethod) 中的内容,很难推荐解决方案 【参考方案1】:

通过为每个需要 CustomerId 的测试创建一个新的 Stripe 客户来解决这个问题。只是希望我不会受到速率限制,哈哈

【讨论】:

以上是关于如何对依赖有效 CustomerId 工作的 Stripe 方法进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

MySQL查找具有相同customerid且具有两个不同值的记录

Angular 和 Spring Boot:使它们有效协同工作的配置

grep -P 不再有效。如何重写我的搜索?

报告存储过程 - 如何避免重复?

Maven依赖

如何使用现有的 customerId 处理 Braintree 付款