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

时间:2017-06-22 09:25:44

标签: c# unit-testing moq

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

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方法返回:

return entities.SingleOrDefault(predicate)
使用predicate构建器创建

Expression(如果需要,我可以添加代码)。

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

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

感谢您的帮助!

编辑 @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"

2 个答案:

答案 0 :(得分:4)

我认为context是实体框架上下文。您在两个存储库之间共享它,因此您对不同存储库的两个查询将返回相同的实体,因为实体框架&#34;缓存&#34;上下文中的实体(在某种意义上)。当它看到你的查询返回已附加到上下文的实体(在这种情况下 - 由第一个查询返回) - 它将再次为第二个实体返回相同的实体(实体是&#34;相同&#34;如果它们有相同的主键和类型)。

答案 1 :(得分:2)

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

我想谈谈你的代码。这里:

moqRepo = new Mock<Repository<Web_Documents>>(context);
moqRepo2 = new Mock<Repository<Web_Documents>>(context);

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

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

var contextMock = new Mock<DbContext>(MockBehavior.Strict);

var repo = new Repository<Web_Documents>(MockBehavior.Strict, contextMock.Object);
var repo2 = new Repository<Web_Documents>(MockBehavior.Strict, contextMock.Object);

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

有关实体框架的更多模拟,请参阅示例Mocking EF DbContext with Moq