Assert.AreSame的这种情况应该返回true吗?

我正在测试我创建的存储库模式,并使用Moq包来模拟我的对象。 我想测试来自2个对象的引用,但结果让我感到惊讶。 这是测试:

Mock<Repository> moqRepo; Mock<Repository> moqRepo2; public void ObjEqGetTest() { //context is DBContext and has been initialized using [TestInitialize] annotation moqRepo = new Mock<Repository>(context); moqRepo2 = new Mock<Repository>(context); var test = moqRepo.Object.Get(1L); var test2 = moqRepo2.Object.Get(1L); Assert.AreSame(test, test2); } 

我的Get方法返回:

 return entities.SingleOrDefault(predicate) 

使用Expression构建器创建predicate (如果需要,我可以添加代码)。

当我创建了两个不同的对象时,为什么这个Assert返回true?

每当您从数据库中获取数据时,Get方法是否返回相同的引用(因为它指向正在使用的模型)?

谢谢你的帮助!

编辑 @CodeCaster说Mocking repos将在我提出的请求中返回null。 但是当我在表Web_Documents中validation值时,Assertions返回true。 让我certificate这一点:

 public void IdExistsGetTest() { moqDoc = new Mock<Repository>(context); var testDoc = moqDoc.Object.Get(1L); Assert.AreEqual(testDoc.NomDocument, "Ajouter une catégorie"); } 

此测试成功,在Web_Documents中, ID = 1的行具有NomDocument = "Ajouter une catégorie"

我假设context是entity framework上下文。 您在两个存储库之间共享它,因此您对不同存储库的两个查询将返回相同的实体,因为entity framework在上下文中“缓存”实体(在某种意义上)。 当它看到你的查询返回已附加到上下文的实体(在这种情况下 – 由第一个查询返回) – 它将再次为第二个实体返回相同的实体(如果实体具有相同的主键,则实体是“相同的”类型)。

Evk已经回答了返回值相同的原因:DbContext为同一个主键返回相同的实例。

我想说一下你的代码。 这里:

 moqRepo = new Mock>(context); moqRepo2 = new Mock>(context); 

你在嘲笑你要测试的课程。 你不应该模拟测试中的类,你应该模拟它的依赖项。

所以嘲笑DbContext,并将其注入你的非模拟回购:

 var contextMock = new Mock(MockBehavior.Strict); var repo = new Repository(MockBehavior.Strict, contextMock.Object); var repo2 = new Repository(MockBehavior.Strict, contextMock.Object); 

现在,您必须设置contextMock以返回您想要的内容。 当被调用时,你的Get()方法调用它的方式。

例如,参见Mocking EF DbContext with Moq以更多地模拟 Entity Framework。