我正在测试我创建的存储库模式,并使用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"
。
答案 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。