2

私はさまざまなエンティティのMoqテストを開発しています。テストの作成と削除は正常に設定できますが、更新はできません。リポジトリ内のエンティティは変更されません。これは、PersistAllが何もしていないことが原因であることがわかっています(おそらく、セットアップが欠落しているためです)。

これは、挿入永続化セットアップのサンプルです(私は更新バージョンを探しています):

agg.Setup(a => a.InsertOnPersist<Thingy>(model)).Callback(() => mockThingies.Add(model));

さらに、リストをリポジトリにリンクするためにこれもあります。

agg.Setup(a => a.GetObjectStore<Artist>()).Returns(mockThingies.AsQueryable());

これは私が持っている更新テストのサンプルです:

 public List<Thingy> mockThingies; //this is our repository
 [TestInitialize]
 public void SetupTests()
 {
    mockThingies= new List<Thingy>();
    Thingy someThingy = new Thingy();
    someThingy.Name = "MyName";
    someThingy.ID = 1;
    mockThingies.Add(someThingy);
  }

    [TestMethod]
    public void CanEditExistingThingy()
    {
        Mock<BusinessExceptionBroadcaster> beb = new Mock<BusinessExceptionBroadcaster>();
        Mock<IValidationEngine> valid = new Mock<IValidationEngine>();
        Mock<IAggregate> agg = new Mock<IAggregate>();
        agg.Setup(a => a.GetObjectStore<Thingy>()).Returns(mockThingies.AsQueryable());
        ThingyRepository repo = new ThingyRepository (agg.Object);
        ThingyService service = new ThingyService (repo, beb.Object, valid.Object);
        Thingy newThingy = new Thingy();
        newThingy.ID = 1; //same as old
        newThingy.Name = "newname"; //new name
        Assert.AreNotEqual(newThingy.Name,mockThingies[0].Name); 
        Assert.IsTrue(service.Update(newThingy));
        Assert.AreEqual(newThingy.Name, mockThingies[0].Name); //FAILS HERE
    }

更新するコードは次のとおりです。

    public bool Update(Thingy entity)
    {  
            Thingy existingThingy= _Thingy.FirstOrDefault(t=>t.ID == entity.ID);
            if (existingThingy != null)
            {
                _Thingy.PersistAll();
                return true;
            }
            else
            {
               //unimportant
            }
        }
        return false;
    }
4

2 に答える 2

2

私が見る限り、これは機能しません。これは、で= 1を設定ThingyIDSetupテストで同じIDを持つ別の1つを作成しているためです。それらは同じIDを共有しますが、同じではないため、変更をリポジトリに伝播することはできません。

実際、これはCUTコードのバグだと思います。これは、IDの一致をテストしている間、リポジトリが更新しているエンティティについて何かを認識していることをテストしないためです。付け加えると、個人的には、リポジトリの設計にそのようなことが許されているのであれば、何か問題があると思います。

EntityFrameworkについて話しているとしたら、エンティティをコンテキストにアタッチする必要があると思います。

于 2012-07-31T20:42:37.793 に答える
2

更新呼び出しが実際に何かを更新するかどうかをテストすることについて心配する必要はありません。サービスがリポジトリの適切なメソッドを呼び出して更新を実行し、永続化することを確認するだけです。実際の更新のテストは、この1つのテストの範囲から少し外れています。

于 2012-07-31T20:49:18.343 に答える