2012-07-31 105 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,我會說你必須將你的實體附加到上下文中。