【问题标题】:How to wrap instance yet forward calls to wrapped instance members?如何包装实例并将调用转发给包装的实例成员?
【发布时间】:2021-12-06 20:56:58
【问题描述】:

鉴于我有一个这样的包装实例,其中 Resolve 方法注入依赖项

    var handler = this.Resolve<DeletePaymentCardHandler>();

    var wrapperHandler = A.Fake<DeletePaymentCardHandler>(
        o => o.Wrapping(handler));
    
    A.CallTo(() => wrapperHandler.EnsurePaymentCardCanBeDeleted(A<DeletePaymentCard>._, A<CancellationToken>._ ))
     .Returns(Task.CompletedTask);
    
    await wrapperHandler.Handle(command, CancellationToken.None);

'Handle' 方法是这样实现的

public async Task Handle(DeletePaymentCard msg, CancellationToken cancellationToken)
{
     await this.EnsurePaymentCardCanBeDeleted(msg, cancellationToken);

     var instance = await this.repository.GetById<Domain.CustomerFundingSources>(msg.CustomerId, cancellationToken);

     instance.Process(msg);

     await this.repository.Save(instance);
}

public virtual async Task EnsurePaymentCardCanBeDeleted(DeletePaymentCard command, CancellationToken cancellationToken)
{
    return Task.CompletedTask
}

我观察到的是,不是在 Handle 中调用注入的存储库,而是调用由 FakeItEasy 创建的代理?

var instance = await this.repository.GetById<Domain.CustomerFundingSources>(msg.CustomerId, cancellationToken);

我认为重点是能够只拦截对某些方法的调用,其余的应该调用包装的实例方法? 来自文档:

"默认情况下,调用一个包装假的没有明确 配置将被转发到被包装的对象。”

【问题讨论】:

    标签: fakeiteasy


    【解决方案1】:

    如果不访问DeletePaymentCardHandler 的所有代码,就不可能完全确定,但我认为它是这样的:

    Handle 不是虚拟的,因此将执行DeletePaymentCardHandler 中的代码,完全绕过 FakeItEasy。

    在Handle中,GetById方法在repository字段上被调用(访问repository不是方法调用,FakeItEasy不能拦截字段访问),很可能已被伪造的DeletePaymentCardHandler 类的构造函数初始化。

    如果repository 字段是从构造函数参数初始化的,FakeItEasy will have supplied a Dummy repository 会满足该构造函数参数。存储库类型很可能是 FakeItEasy 可以伪造的,因此其值为 Fake。

    因此,在wrappedHandler.Handle 中,真正的Handle 代码调用了假的repository。

    如果您想要其他一些行为,那么可能需要为假货提供与包装处理程序相同的存储库。或者Handle 可以通过虚拟属性或方法访问存储库,这将被 FakeItEasy 拦截并转发给包装处理程序,然后处理程序将访问由Resolve 方法提供的存储库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多