我正在为各种实体开发Moq测试。我可以设置创建和删除测试,但不能更新 - 存储库中的实体不会更改。我知道这是因为PersistAll什么都不做(可能是由于我缺少一个设置)。
这是插入持久设置的示例(我正在寻找更新版本):
agg.Setup(a => a.InsertOnPersist<Thingy>(model)).Callback(() => mockThingies.Add(model));
此外,我还将此链接到List作为存储库:
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;
}
答案 0 :(得分:2)
据我所知,它无法正常工作,因为您在Thingy
中设置了一个ID
Setup
= 1,然后创建具有相同ID的另一个{{1}}在测试中。虽然它们共享相同的ID,但它们并不相同,因此您的更改无法传播到存储库。
事实上,我认为这是你的CUT代码中的一个错误,因为当你测试ID匹配时,你不会测试你的存储库知道你正在更新的实体。另外,我个人认为如果允许这样的事情,你的存储库设计就会出现问题。
如果我们谈论的是EntityFramework,我会说你必须将你的实体附加到上下文中。
答案 1 :(得分:2)
不要担心测试更新调用是否实际更新了某些内容。您只需要验证您的服务是否在repo上调用适当的方法来执行更新并保持不变。测试实际更新有点超出了这一测试的范围。