私が作成したリポジトリパターンをテストしています。オブジェクトをモックするためにMoqパッケージを使用しています。私は2つのオブジェクトからリファレンスをテストしたかったのですが、結果的に私は驚きました。ここでのテストは、次のとおりです。このケースのAssert.AreSameはtrueを返しますか?
Mock<Repository<Web_Documents>> moqRepo;
Mock<Repository<Web_Documents>> moqRepo2;
public void ObjEqGetTest()
{
//context is DBContext and has been initialized using [TestInitialize] annotation
moqRepo = new Mock<Repository<Web_Documents>>(context);
moqRepo2 = new Mock<Repository<Web_Documents>>(context);
var test = moqRepo.Object.Get(1L);
var test2 = moqRepo2.Object.Get(1L);
Assert.AreSame(test, test2);
}
そして、私のGetメソッドが返す:Expression
ビルダーを使用して作成されて
return entities.SingleOrDefault(predicate)
predicate
(必要であれば、私は、コードを追加することができます)。
なぜAssert
がtrueを返すのですか?2つの異なるオブジェクトを作成したときはどうなりますか?
Getメソッドは、DBからデータをフェッチするたびに(同じモデルが使用されているモデルを指しているので)同じ参照を返しますか?
ありがとうございました!
EDIT @CodeCasterは、私が作成した要求では、Mocking reposはnullを返すと述べています。しかし、テーブルWeb_Documentsの値を検証すると、Assertionsがtrueを返します。私はこのことを実証してみましょう:
public void IdExistsGetTest()
{
moqDoc = new Mock<Repository<Web_Documents>>(context);
var testDoc = moqDoc.Object.Get(1L);
Assert.AreEqual(testDoc.NomDocument, "Ajouter une catégorie");
}
このテストが成功した、とWeb_Documentsで、ID = 1
の行はNomDocument = "Ajouter une catégorie"
を持っています。
[ask]を読んで[mcve]を作成してください。また、ユニットテストのためにDbContextに依存してはいけません。テスト中のクラスを模倣することは意味をなさない。あなたは依存関係を模倣する。 test2とtest2は共にnullになります。 – CodeCaster
私は誤った前提で私の答えに基づいて、それを削除しました。私が主張したことは、具体的なクラスを嘲笑するときではなく、インターフェイスを嘲笑するときにのみ当てはまります。私はMoqがそのメソッドが設定されていないときに具体的なクラスを呼び出すとは思わなかった。あなたはまだまったく間違っていますが、答えを編集しようとします。 – CodeCaster
@コードキャスター私は、あなたが言ったことについて質問があります。私の 'リポジトリ'はパラメータとしてDBContextを必要とするので、もし私がコンテキストだけを嘲笑したら、私がそれを作成するときに 'リポジトリ'にDBContextパラメータを与える方法は? –