سؤال

أنا أواجه مشكلة غريبة تتعلق AutoFixture و AutoMoqCustomization وكيف يتعامل مع أتمتة الطبقات الخرسانية.وأظن أنني لا تستخدم بشكل جيد للغاية ولكن أود أن أعرف ما هي المشكلة.أولا وقبل كل شيء لها بعض السياق.لنفترض أن لدي فصلا أريد اختباره :

public class IdentityApplicationService
{
    public IdentityApplicationService(
        TenantProvisioningService tenantProvisioningService)
    {
        // guard clause etc.
        _tenantProvisioningService = tenantProvisioningService;
    }
}

وفئة التبعية TenantProvisioningService (تبعيات تينانتبروفيسيونينغسرفيس ليست ذات الصلة هنا لأنها سوف تكون السيارات سخر وأنا لا يهمني في اختبار بلدي):

public class TenantProvisioningService
{
    readonly IRoleRepository _roleRepository;
    readonly ITenantRepository _tenantRepository;
    readonly IUserRepository _userRepository;

    public TenantProvisioningService(
        ITenantRepository tenantRepository,
        IUserRepository userRepository,
        IRoleRepository roleRepository)
    {
        this._roleRepository = roleRepository;
        this._tenantRepository = tenantRepository;
        this._userRepository = userRepository;
    }
}

وهنا اختباري البسيط :

[Fact]
public void ShouldReturnTenantWhenCallingProvisionTenant()
{
    var fixture = new Fixture().Customize(new AutoMoqCustomization());
    var mockTenantProvisioningService =
        fixture.Freeze<Mock<TenantProvisioningService>>();
    var sut = fixture.Create<IdentityApplicationService>();
    var command = new ProvisionTenantCommand(
        "bla",
        "bla SaaS platform",
        "superadmin",
        "superadmin",
        "admin@bla.bla",
        null,
        null,
        null,
        null,
        null,
        null,
        null);
    var tenant = sut.ProvisionTenant(command);

    // some asserts
}

هذا لا يعمل لأنه عندما أتصل fixture.Create<IdentityApplicationService>() ثم في انها منشئ يتم حقن تينانتروفيسيونينغسرفيس ملموسة بدلا من وكيل واحد التي يمكنك أن تجد في موكينانتروفيسيونينجسرفيس.كائن.

إذا كنت إعادة كتابة الاختبار مثل هذا (لاحظ خط حقن لاعبا اساسيا) كل شيء يعمل كما هو متوقع (من قبلي على الأقل :))

[Fact]
public void ShouldReturnTenantWhenCallingProvisionTenant()
{
    var fixture = new Fixture().Customize(new AutoMoqCustomization());
    var mockTenantProvisioningService =
        fixture.Freeze<Mock<TenantProvisioningService>>();
    fixture.Inject(mockTenantProvisioningService.Object);
    var sut = fixture.Create<IdentityApplicationService>();
    var command = new ProvisionTenantCommand(
        "bla",
        "bla SaaS platform",
        "superadmin",
        "superadmin",
        "admin@bla.bla",
        null,
        null,
        null,
        null,
        null,
        null,
        null);
    var tenant = sut.ProvisionTenant(command);

    // some asserts
}

لذا سؤالي هو :أنا أفعل ذلك خطأ أم أنها الطريقة التي ينبغي أن يكون?إذا لم يكن الأمر كذلك ، فيرجى إعطائي التفسير لماذا يتصرف التركيب التلقائي على هذا النحو.

هل كانت مفيدة؟

المحلول

كما مارك سيمان يشير إلى, ، هذا هو السلوك المتوقع.

أدناه هو رمز من المنشور الأصلي تم التحديث للعمل مع الإصدار الحالي من التركيب التلقائي:

Func<ISpecimenBuilder, bool> concreteFilter = 
    sb => !(sb is MethodInvoker);

var relays = new FilteringRelays(concreteFilter);

var fixture = new Fixture(relays).Customize(
    new AutoMoqCustomization(
        new MockRelay(
            new TrueRequestSpecification())));

ال FilteringRelays الطبقة لا تزال هي نفسها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top