サポートされているユニットテストの競合

c# effort entity-framework-6 unit-testing vstest

質問

私はこのプロジェクトでいくつかのテストを継承しました。 SQLデータベースに対して実行しているとき、彼らは働いていました、しかしゆっくり。 Effortの使用に切り替えようとしています。
.NET4.5、EF6.2、努力1.3.10。

私のユニットテストには2つの関連した問題があります。

テストを並行して実行するかどうかは関係ありません。

1)一度に複数実行した場合、

タイプ 'Center.Shared.Person'の複数のエンティティが同じ主キー値を持っているため、変更の保存または受け入れに失敗しました。明示的に設定された主キー値が一意であることを確認してください。データベースで生成された主キーがデータベースとEntity Frameworkモデルで正しく設定されていることを確認してください。データベース優先/モデル優先構成にEntity Designerを使用します。 Code Firstの設定には 'HasDatabaseGeneratedOption'フルーエントAPIまたは 'DatabaseGeneratedAttribute'を使用してください。明示的に設定された主キー値が一意であることを確認しますデータベースによって生成された主キーがデータベースおよびEntity Frameworkモデルで正しく設定されていることを確認します。コード優先設定の場合は 'DatabaseGeneratedAttribute'。

そのため、テストは適切に分離されていないようです。
コードをたどってみると、CreateTransientが呼び出されていることがわかりますが、一時的なものではないようです。

    public DbConnection CreateConnection(string nameOrConnectionString)
    {
        lock (_lock)
        {
            if (_connection == null)
            {
                _connection = Effort.DbConnectionFactory.CreateTransient();
            }

            return _connection;
        }
    }

TestInitializeルーチンでデータベースをリセットしようとしました。

    [TestInitialize]
    public override void Initialize()
    {
        db.Database.Delete();
        db.Database.CreateIfNotExists();
        db.Database.Initialize(true);

これは非常に複雑なコードなので、もっとコードを投稿する必要がある場合は、うさぎの穴の底にたどり着くまでに長い時間がかかります。おそらくPoCを作成する方が良いでしょう。

2)テストを独立して実行すると、別の問題が発生します。繰り返しになりますが、これらはSQLに対しては渡されましたが、Effortには渡されませんでした。

    [TestMethod]
    public void ClientAccessorTests_Find()
    {
        Client result;
        Client client = new Client()
        {
            Complete = false,
            HeadOfHousehold = true,
            PersonID = _person.PersonID
        };

        _accessor.Create(client, _accessor.DefaultConnectionContext);

        result = _accessor.Find(new object[] { client.ClientID }, _accessor.DefaultConnectionContext);

        Assert.IsNotNull(result);  // Fails with Assert.IsNotNull failed. 
    }

作成する

    public virtual EntityType Create(EntityType entity, ConnectionContext connectionContext)
    {
        IsContextValid(connectionContext);
        if (entity == null) throw new ArgumentException("", "entity");

        using (var db = CreateDbContext<DbContextType>(connectionContext))
        {
            db.Set<EntityType>().Add(entity);
            db.SaveChanges();
        }

        return entity;
    }

検索は

    public virtual EntityType Find(object[] primaryKey, ConnectionContext connectionContext)
    {
        IsContextValid(connectionContext);
        if (primaryKey == null || primaryKey.Length == 0) throw new ArgumentException("", "primaryKey");

        using (var db = CreateDbContext<DbContextType>(connectionContext))
        {
            return db.Set<EntityType>().Find(primaryKey);
        }
    }

私はそれがCreateDbContextを呼んでいることを知っています、しかし私がそれが同じIDを持つ同じデータベースであるように見えることができる限り、コードを辿ること。

テストが分離される原因は何ですか。
インメモリデータベースを使用しているときに、なぜFindが機能しなくなるのかについてのアイデアはありますか。

受け入れられた回答

私は、すべてがapp.configファイルの設定を介して接続されるという暗黙のアプローチを使用しようとしていました。
そのアプローチを断念してデータベース接続を作成し、それを明示的に設定した後、私はもっと運が良くなった。

        System.Data.Common.DbConnection connection = new EffortProviderFactory("").CreateConnection("");
        _accessor = new ClientAccessor();
        _accessor.Connection = connection;
        db = new EntitiesDb(connection);

ベースアクセサは毎回DBのコピーを作成しますが、同じDbConnectionを使用している限り、問題ありません。それで私はそれをアクセサに設定し、それからここでそれを使います:

        if (_connection == null) {   // this is the path for the application
            if (connectionContext == null) {
                ret = new T();
            } else {
                ret = (T)Activator.CreateInstance(typeof(T), new object[] { connectionContext });
            }
        } else {  // this is the path for unit tests.
            ret = (T)Activator.CreateInstance(typeof(T), new object[] { _connection });
        }

最後に、DbConnectionをDbContextとその子孫に渡したコンストラクターを追加する必要がありました。

    public EntitiesDb(DbConnection connection) : base(connection) { }

'検索'が機能し、テストが互いに干渉しません。
次のステップは、これをすべて基本クラスにプッシュすることです。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ