5

Entity Framework を使用するドメイン用の一連のデータベース統合テストを作成しようとしています。いくつかのシナリオでは、オブジェクトを自動固定することをお勧めします。私の理想的な構文は次のようなものになります

[TestMethod]
public void AutofixtureMyEntityEntity()
{
    var fixture = new Fixture();

    fixture.Customize<MyEntity>(
      c => c.FromFactory<MyDbContext>(ctx => ctx.Set<MyEntity>().Create()));

    using (var context = new MyDbContext())
    {
        fixture.Inject(context);
        var entity = fixture.CreateAnonymous<MyEntity>();
        context.Set<MyEntity>().Add(entity);
        context.SaveChanges();
    }
}

[TestMethod]    
[ExpectedException(typeof(InvalidOperationException))]
public void AutoFixtureMyEntityEntityWithoutInjection()
{
    var fixture = new Fixture();

    fixture.Customize<MyEntity>(
       c => c.FromFactory<MyDbContext>(ctx => ctx.Set<MyEntity>().Create()));

    using (var context = new MyDbContext())
    {
        var entity = fixture.CreateAnonymous<MyEntity>();
        context.Set<MyEntity>().Add(entity);
        context.SaveChanges();
    }
}

明らかにCreateAnonymous()、ファクトリの入力パラメータを想定していないため、これは機能していません。FromFactory()何を提供するかについての理解に欠陥があるとしか思えません。コメントは読んでいますが、

/// Specifies that a specimen should be created in a particular way, using a single input
/// parameter for the factory.

ploehs blogを読んだ後、これらの部分がどのように相互作用するかについて少し混乱しました。

ファクトリ呼び出し中のインスタンスはMyDbContext、渡したインスタンスではありませんInject()

4

1 に答える 1

7

このようなものは機能しますか?

var fixture = new Fixture();
fixture.Customize<MyEntity>(c => c
    .FromFactory<MyDbContext, MyEntity>(ctx => ctx.Set<MyEntity>.Create()));

using (var context = new MyDbContext())
{
    fixture.Inject(context);
    var item = fixture.CreateAnonymous<MyEntity>();
    context.Set<MyEntity>().Add(item);
    context.SaveChanges();
}

免責事項:私はこれをコンパイルしようとしていません...


FWIW、AutoFixtureでxUnit.netを使用している場合は、テストを次のように減らすことができます。

[Theory, MyAutoData]
public void TheTest([Frozen]MyDbContext context, MyEntity item)
{
    context.Set<MyEntity>().Add(item);
    context.SaveChanges();
}
于 2013-01-19T22:14:29.163 に答える