1

POCOクラス(プロキシなし)でEntity Framework 4.3.1を使用しています。User クラスには、他のユーザーが使用してはならない電子メール アドレスが格納されます。次のテストは、これの検証を確認するために使用されます。

  [TestMethod]
    public void UserEmailNotUniqueTest()
    {
        // arrange
        // - create user one and store in db
        User userOne = TIF.GetUser(model, true);
        // - create user two and store in db
        User userTwo = TIF.GetUserTwo(model, true);

        // act
        // - change user one email to user two email
        userOne.EmailAddress = userTwo.EmailAddress;
        // - save
        model.SaveChanges();

テストの初期化により、空のデータベースが作成され、それが "モデル" DbContext 子孫に接続されます。TIF クラスは、ユーザーのテスト インスタンスを作成し、データベースに格納します。これは機能し、両方のユーザーがデータベースに存在します。この検証では、データベースの状態が変更されていない必要があるため、SaveChanges メソッドをオーバーライドして、シリアライズ可能なトランザクションを渡すことができます。

public virtual int SaveChanges(bool commitWhenDone)
    {
            try
            {
                saving = true;
                int result;
                TransactionScope scope;
                using (scope = new TransactionScope( modelTransaction.Get() ))
                {
           //… open connection etc. 
                    ChangeTracker.DetectChanges();
                    IEnumerable<DbEntityValidationResult> validationResults = 
                        GetValidationErrors();
           //… handle the errors
                    result = base.SaveChanges();

変更が検出されないため、テストは失敗します。検証コードは実行されません。model.Entity(userOne).State を調べると「Unchanged」が返されますが、CurrentValues には適切な値が含まれています。つまり、userOne には userTwo の電子メール アドレスがあります。

何が欠けていますか?

4

0 に答える 0