2012-07-31 100 views
2

我正在为各种实体开发Moq测试。我可以设置创建和删除测试,但不更新 - 存储库中的实体不会更改。我知道这是由于PersistAll什么都不做(可能是由于我缺少一个设置)。设置MOQ更新测试

这是一个插入的样本坚持设置(我找了一个更新的版本):

agg.Setup(a => a.InsertOnPersist<Thingy>(model)).Callback(() => mockThingies.Add(model)); 

另外,我也有这样的列表链接到作为存储库:

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; 
    } 

回答

2

不要担心测试更新调用是否实际更新某些内容。你只需要验证你的服务在repo上调用适当的方法来执行更新并保持。测试实际的更新有点超出了这个测试的范围。

2

据我所看到的,它不能正常工作,因为你在Setup设置一个ThingyID = 1,然后创建另一个与测试相同的ID。尽管它们共享相同的ID,但它们并不相同,因此您的更改无法传播到存储库。实际上,我认为这是CUT代码中的一个bug,因为当你测试ID匹配时,你不测试你的仓库知道你正在更新的实体的一些东西。补充一点,我个人认为如果存储库设计允许这样的话,那么存在一些问题。

如果我们在谈论EntityFramework,我会说你必须将你的实体附加到上下文中。