如何对依赖有效 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且具有两个不同值的记录