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を参照するだけ)を調べましたが、期待に一致すると思われる方法が見つかりませんでした。 私がここでやりたいことをする方法はありますか? 基本的に実行時に提供されるタイプのインスタンスを作成しますか?
私は何が起こっているのか知っているようです😄
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:
最も参考になるコメント
ありがとう!
汎用の
fixture.Create<T>()
オブジェクトのソースコードを読んで、最終的にどこに到達するかを理解することで、これが機能することもわかりました。私はそれらが多かれ少なかれ同等であると思います:)どうもありがとう!