这可能至少没有帮助,但无论如何我都会说。
似乎您一次尝试测试太多,为什么不测试 BillingService -> BillingValidation,然后是 BillingService -> BillingRepository 等。这样,您将有一套测试证明每个测试都有效,然后当您启动时PublicApi Layer你只需要mock ApiService,因为你已经测试了它下面的所有东西,所以再次测试它没有任何价值。
一般来说,我一次只会测试 1 层,但我不知道你的完整场景,所以你可能有一些我没有考虑到的东西,所以如果是这种情况,你真的需要一起测试所有这些,我会带上在像 Ninject 之类的简单轻量级 DI 框架中。
这样,您可以将所有类型绑定到模拟,然后从中实例化您的 PublicApi。
使用 ninject 它看起来像:
Kernel.Bind<UserRepository>.ToConst(YourMockUserRepositoryInstance);
Kernel.Bind<UserService>.ToConst(YourMockUserServiceInstance);
Kernel.Bind<BillingRepository>.ToConst(YourMockBillingRepositoryInstance);
Kernel.Bind<BillingValidation>.ToConst(YourMockBillingValidationInstance);
Kernel.Bind<BillingService>.ToConst(YourMockBillingServiceInstance);
Kernel.Bind<AccountingFacade>.ToConst(YourMockAccountingFacadeInstance);
Kernel.Bind<ApiService>.ToConst(YourMockApiServiceInstance);
Kernel.Bind<PublicApi>.ToSelf();
var publicApi = Kernel.Get<PublicApi>();
虽然你必须问自己,你在这里测试什么?如果它只是互动,我会像我第一次提到的那样做,如果它更多,那么可能会考虑后一种选择。不管怎样,我希望它能给你一些选择。