Autofixture: هل من الممكن إنشاء مثيل بناءً على وقت التشغيل `System.Type`؟

تم إنشاؤها على ١٦ نوفمبر ٢٠١٧  ·  3تعليقات  ·  مصدر: AutoFixture/AutoFixture

للتأكد من عدم تفجير تعيينات AutoMapper الخاصة بي ، لدي فئة اختبار مشابهة لما يلي:

public class MapperTests
{
    private readonly IMapper _mapper; // from AutoMapper
    private readonly IFixture _fixture;

    public MapperTests()
    {
        _mapper = SetUpAutoMapper();
        _fixture = new Fixture();
    }

    [Theory]
    [InlineData(typeof(Foo), typeof(Bar))]
    [InlineData(typeof(Boo), typeof(Far))]
    // etc ...
    public void CanMapTypes(Type inputType, Type outputType)
    {
        var input = _fixture.Create(inputType);

        // throws exceptions if something's broken:
        _mapper.Map(input, outputType)
    }
}

اكتشفت للتو أن _fixture.Create(inputType) لا يُنشئ فعليًا مثيل من النوع (على سبيل المثال Foo في الاختبار الأول) ولكنه في الواقع مثيل System.Type . هذا ، بالطبع ، يجعل اختباري عديم الفائدة إلى حد ما.

لقد بحثت في الطرق المتاحة (فقط تصفح IntelliSense) ولكن لم أجد الطريقة التي يبدو أنها تطابق توقعاتي. هل هناك طريقة لفعل ما أريده هنا؟ إنشاء مثيل من النوع المقدم في وقت التشغيل بشكل أساسي؟

question

التعليق الأكثر فائدة

شكرا!

من خلال قراءة الكود المصدري لكائن fixture.Create<T>() ، ومعرفة المكان الذي سينتهي به الأمر في النهاية ، اكتشفت أيضًا أن هذا يعمل:

var input = new SpecimenContext(_fixture).Resolve(sourceType);

أعتقد أنهم معادلين أكثر أو أقل :) شكرًا جزيلاً!

ال 3 كومينتر

يبدو أنني أعرف ما يجري

إذا جربت AutoFixture v4 ، فستجد أن هذا الرمز لا يتم استخلصنا الأحمال الزائدة المربكة لطريقة Create() لحزمة منفصلة ، لذلك يجب على المستخدمين الذين يعرفون ما يفعلونه فقط استخدامها.

ج #
_fixture.Create (نوع الإدخال) ؛

It might look that you are making a request of `typeof(Foo)` here, however in reality you are passing this argument as a `seed` and the actual request type is `typeof(Type)`.  To fix the issue please tune a bit your code:

```c#
public class Foo
{
}

[Theory]
[InlineData(typeof(Foo))]
public void TestTypeRequest(Type requestType)
{
    var fixture = new Fixture();
    var result = fixture.Create(requestType, new SpecimenContext(fixture));

    Assert.IsAssignableFrom<Foo>(result);
}

ربما لا تكون واجهة برمجة التطبيقات موجزة ، لكن السيناريو الخاص بك ليس شائعًا ، لذا يجب أن يكون ذلك جيدًا.

اسمحوا لي أن أعرف ما إذا كان ذلك ساعد 😉

شكرا!

من خلال قراءة الكود المصدري لكائن fixture.Create<T>() ، ومعرفة المكان الذي سينتهي به الأمر في النهاية ، اكتشفت أيضًا أن هذا يعمل:

var input = new SpecimenContext(_fixture).Resolve(sourceType);

أعتقد أنهم معادلين أكثر أو أقل :) شكرًا جزيلاً!

tlycken في الواقع ، كلا

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات