2017-05-26 237 views
3

不同的結果,我有兩個操作方法,編輯和刪除(包括POST)。這些方法從DB接口調用方法。這些接口方法在名爲DBManager的類中實現。在這些方法中,用戶被編輯和一個布爾結果被返回,這同樣適用於delete方法,返回的結果要麼是真的還是假的,這取決於刪除或修改是否成功與否。懲戒兩個來自同一方法

現在我想嘲笑兩個結果(真假),這裏是我的代碼,我設置了嘲笑:

//setup passed test 
_moqDB.Setup(md => md.EditStaff(It.IsAny<StaffEditViewModel>())).Returns(true); 

//setup failed test 
_moqDB.Setup(md => md.EditStaff(It.IsAny<StaffEditViewModel>())).Returns(false); 

//Setup Delete method test 
_moqDB.Setup(x => x.DeleteStaffMember(It.IsAny<int>())).Returns(true); 

//delete failed 
_moqDB.Setup(x => x.DeleteStaffMember(It.IsAny<int>())).Returns(false);` 

這裏是我的測試代碼

[TestMethod] 
    public void PostUpdatedUserTest() 
    { 
     var staffEdit = new StaffEditViewModel() 
     { 
      BranchID = "HQ", 
      SiteID = "TestingSite", 
      StaffEmail = "[email protected]", 
      StaffID = 887, 
      StaffNameF = "TestUser", 
      StaffNameS = "TestSurname", 
      StaffPassword = "****", 
      StaffSecurity = UserRoles.Administrator 
     }; 

     //Act 
     var result = _userController.Edit(staffEdit); 

     //Assert 
     Assert.IsNotNull(result); 
     Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult)); 
     var redirectResult = result as RedirectToRouteResult; 
     Assert.AreEqual("Index", redirectResult.RouteValues["action"]); 
    } 

    [TestMethod] 
    public void PostUpdatedUserFailTest() 
    { 
     var staffEdit = new StaffEditViewModel() 
     { 
      BranchID = "HQ", 
      SiteID = "TestSite", 
      StaffEmail = "[email protected]", 
      StaffID = 1, 
      StaffNameF = "Test1", 
      StaffNameS = "TestSurname", 
      StaffPassword = "****", 
      StaffSecurity = UserRoles.Administrator 
     }; 

     //Act 
     var result = _userController.Edit(staffEdit) as ViewResult; 

     // Assert 
     Assert.IsNotNull(result); 
     Assert.IsTrue(string.IsNullOrEmpty(result.ViewName) || result.ViewName == "Error"); 
    } 

測試似乎只有當我單獨運行它們時纔會通過(運行一個而另一個被註釋掉)。我的問題是,是否有運行的一種方式這個測試一下子,讓他們通過,記得我試圖測試兩種不同的情況(真假)。他們說,假設是所有錯誤的惡魔,因爲現在假的結果似乎很好地工作,然後又真實的結果將是完美的

+0

什麼參數應該表明Moq你需要返回true或false,因爲目前在模擬設置中沒有區別...... – kayess

+1

@Ronny - 一種方法是設置你的模擬對象每個單元測試(每個內部測試有一個單獨的設置)在排列步驟。這樣你就可以確定你正在測試一個具體的設置。 另一種選擇是爲具體輸入參數進行設置,例如, _moqDB.Setup(X => x.DeleteStaffMember(1))。返回(真),而不是It.IsAny <...>。 – peev

+0

@ kayess,我不確定我是否在這裏正確地關注你,但是例如,StaffID 1的用戶不存在,所以編輯應該失敗,因爲具有staffID 887的用戶確實存在,所以我期待通過結果,就像我在單獨運行測試方法時所說的那樣(在評論其他測試方法時),他們似乎完全像我希望的那樣工作。我可能錯過了一些東西 – Ronny

回答

2

可以使用的功能在SetupReturns當嘲笑構件被稱爲執行基於提供的輸入定製邏輯。

_moqDB 
    .Setup(_ => _.EditStaff(It.IsAny<StaffEditViewModel>())) 
    .Returns((StaffEditViewModel arg) => { 
     if(arg != null && arg.StaffID == 887) return true; 
     else return false; //this will satisfy other Ids like 1 
    }); 

_moqDB 
    .Setup(_ => _.DeleteStaffMember(It.IsAny<int>())) 
    .Returns((int staffId) => { 
     if(staffId == 887) return true; 
     else return false; //this will satisfy other Ids like 1 
    }); 

您可以實現什麼Func內不斷邏輯來滿足多種場景爲你的測試。

另外,如評論中提到嘗試,這樣,當作爲成員的最後設置將覆蓋匹配以往任何一起運行的設置不會互相覆蓋到每一次的測試安排。它簡化了測試過程,因爲每個單元測試應隔離運行,不應該在列表中的其他測試的影響。

2

你給起訂量時,應返回true或false沒有條件,我不能只是假設。只要改變編輯用例的設置爲:

_moqDB.Setup(md => md.EditStaff(It.Is<StaffEditViewModel>(x => x.StaffID == 887))).Returns(true); 

_moqDB.Setup(md => md.EditStaff(It.Is<StaffEditViewModel>(x => x.StaffID == 1))).Returns(false); 

這裏的noticable的變化是使用的It.Is()而不是你It.IsAny()。從文檔:

It.IsAny()

匹配給定TValue型

It.Is()的任何值:

匹配滿足給定謂詞的任意值。