2017-05-26 234 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()的任何值:

匹配满足给定谓词的任意值。