gpt4 book ai didi

c# - 从同一方法模拟两个不同的结果

转载 作者:太空狗 更新时间:2023-10-30 00:37:51 26 4
gpt4 key购买 nike

我有两个操作方法,编辑和删除(都发布)。这些方法从数据库接口(interface)调用方法。这些接口(interface)方法在名为 DBManager 的类中实现。在这些方法中,用户被编辑并返回 bool 结果,删除方法也是如此,返回的结果将是 true 或 false,具体取决于删除或编辑是否成功。

现在我想模拟两个结果(真和假),这是我设置模拟的代码:

//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 = "Zandile.Mashele@avisbudget.co.za",
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 = "Zandile.Mashele@avisbudget.co.za",
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");
}

测试似乎只有在我单独运行它们时才能通过(运行一个而另一个被注释掉)。我的问题是,有没有一种方法可以一次运行所有这些测试并让它们通过,请记住我正在尝试测试两种不同的场景(真和假)。他们说假设是所有错误的魔鬼,现在我不能假设只是因为错误的结果似乎工作正常那么真实的结果也会是完美的

最佳答案

您可以使用 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 中实现任何逻辑以满足您的测试的多种场景。

此外,如评论中所述,尝试为每个测试安排一次,以便设置在一起运行时不会相互覆盖,因为成员上的最后一个设置将覆盖任何先前匹配的设置。它简化了测试过程,因为每个单元测试都应该独立运行,并且不应受到列表中其他测试的影响。

关于c# - 从同一方法模拟两个不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44195399/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com