Autofixture: ランタイム `System.Type`に基づいてインスタンスを作成することは可能ですか?

作成日 2017年11月16日  ·  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()メソッドのオーバーロードを別のパッケージに

`` `c#
_fixture.Create(inputType);

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はおそらく簡潔ではありませんが、シナリオは一般的ではないため、問題ないはずです。

それが役に立ったかどうか教えてください😉

ありがとう!

汎用のfixture.Create<T>()オブジェクトのソースコードを読んで、最終的にどこに到達するかを理解することで、これが機能することもわかりました。

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

私はそれらが多かれ少なかれ同等であると思います:)どうもありがとう!

@tlycken確かに、両方のスニペットは同じように機能しますが、オプションの方がはるかに見栄えがします:)必要に応じて将来使用します:blush:

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

josh-degraw picture josh-degraw  ·  4コメント

ecampidoglio picture ecampidoglio  ·  7コメント

ploeh picture ploeh  ·  3コメント

zvirja picture zvirja  ·  8コメント

zvirja picture zvirja  ·  3コメント