Autofixture: Apakah mungkin membuat instance berdasarkan `System.Type` runtime?

Dibuat pada 16 Nov 2017  ·  3Komentar  ·  Sumber: AutoFixture/AutoFixture

Untuk memastikan pemetaan AutoMapper saya tidak meledak, saya memiliki kelas pengujian yang mirip dengan berikut ini:

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)
    }
}

Saya baru saja menemukan bahwa _fixture.Create(inputType) sebenarnya tidak membuat turunan dari tipe tersebut (mis. Foo pada pengujian pertama) tetapi sebenarnya merupakan turunan dari System.Type . Ini, tentu saja, membuat pengujian saya tidak berguna.

Saya melihat melalui metode yang tersedia (hanya menjelajahi IntelliSense) tetapi tidak dapat menemukan yang sesuai dengan harapan saya. Apakah ada cara untuk melakukan apa yang saya inginkan di sini; pada dasarnya membuat instance dari tipe yang disediakan saat runtime?

question

Komentar yang paling membantu

Terima kasih!

Dengan membaca kode sumber objek fixture.Create<T>() generik, mencari tahu di mana akhirnya, saya juga menemukan bahwa ini berfungsi:

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

Saya kira mereka kurang lebih setara :) Terima kasih banyak!

Semua 3 komentar

Sepertinya saya tahu apa yang sedang terjadi

Jika Anda mencoba AutoFixture v4 , Anda akan menemukan bahwa kode ini tidak dapat dikompilasi. Alasannya adalah karena kami mengekstrak kelebihan metode Create() membingungkan ke paket terpisah, jadi hanya pengguna yang tahu apa yang mereka lakukan yang boleh menggunakannya.

```c#
_fixture.Create(Tipe masukan);

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);
}

API mungkin tidak ringkas, namun skenario Anda tidak umum, jadi itu akan baik-baik saja.

Beri tahu saya apakah itu membantu

Terima kasih!

Dengan membaca kode sumber objek fixture.Create<T>() generik, mencari tahu di mana akhirnya, saya juga menemukan bahwa ini berfungsi:

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

Saya kira mereka kurang lebih setara :) Terima kasih banyak!

@tlycken Memang, kedua cuplikan melakukan hal yang sama, sementara opsi Anda terlihat jauh lebih baik :) Akan menggunakannya di masa mendatang jika diperlukan :blush:

Apakah halaman ini membantu?
0 / 5 - 0 peringkat