C# 使用Moq的单元测试
这是我控制器下的一种方法,用于创建虚拟密钥来加密应用程序中的数据,并将其存储在AmazonS3存储桶中C# 使用Moq的单元测试,c#,.net,mocking,C#,.net,Mocking,这是我控制器下的一种方法,用于创建虚拟密钥来加密应用程序中的数据,并将其存储在AmazonS3存储桶中 public JsonResult SaveMasterKeys(string MekText, int Thismek) { string folderName = string.Empty, fileName = string.Empty; List<string> folderNameList = new Lis
public JsonResult SaveMasterKeys(string MekText, int Thismek)
{
string folderName = string.Empty, fileName = string.Empty;
List<string> folderNameList = new List<string>();
folderNameList.Add("Guard1");
folderNameList.Add("Guard2");
try
{
if (Thismek == 1)
{
folderName = "Guard1";
fileName = "NewMek1.key";
}
else
{
folderName = "Guard2";
fileName = "NewMek2.key";
}
AWSS3File aws = new AWSS3File();
//aws.BucketExist(filePath);
//aws.CreateFile(MekText, filePath);
// Check Weather the Folder is exist or not
if (!aws.CheckFolderExist(folderName))
{
foreach (var item in folderNameList)
{
aws.CreateFolder(item);
if (item == "Guard1")
{
aws.CreateFileIntoS3((item == folderName ? MekText : ""), item, "NewMek1.key");
aws.CreateFileIntoS3("", item, "Mek1.key");
}
else
{
aws.CreateFileIntoS3((item == folderName ? MekText : ""), item, "NewMek2.key");
aws.CreateFileIntoS3("", item, "Mek2.key");
}
}
}
else
{
aws.CreateFileIntoS3(MekText, folderName, fileName);
}
ViewData["SaveMessage"] = "Saved successfully.";
}
catch (Exception ex)
{
XTP.Logger.LogCritical("XTP.Web.internaltools", ex.ToString());
ViewData["SaveMessage"] = "Keys not updated successfully.";
}
return Json(new { success = true, value = ViewData["SaveMessage"] }, JsonRequestBehavior.AllowGet);
}
public JsonResult savemasterkey(字符串MekText,int Thismek)
{
string folderName=string.Empty,fileName=string.Empty;
List folderNameList=新列表();
folderNameList.添加(“Guard1”);
folderNameList.添加(“Guard2”);
尝试
{
如果(Thismek==1)
{
folderName=“Guard1”;
fileName=“NewMek1.key”;
}
其他的
{
folderName=“Guard2”;
fileName=“NewMek2.key”;
}
AWSS3File aws=新的AWSS3File();
//aws.BucketExist(文件路径);
//aws.CreateFile(MekText,filePath);
//检查文件夹是否存在
如果(!aws.CheckFolderExist(folderName))
{
foreach(folderNameList中的变量项)
{
aws.CreateFolder(项目);
如果(项目==“1”)
{
aws.CreateFileIntoS3((item==folderName?MekText:),item,“NewMek1.key”);
aws.CreateFileIntoS3(“,项,“Mek1.key”);
}
其他的
{
aws.CreateFileIntoS3((item==folderName?MekText:),item,“NewMek2.key”);
aws.CreateFileIntoS3(“,项,“Mek2.key”);
}
}
}
其他的
{
aws.CreateFileIntoS3(MekText、folderName、fileName);
}
ViewData[“SaveMessage”]=“已成功保存。”;
}
捕获(例外情况除外)
{
LogCritical(“XTP.Web.internaltools”,例如ToString());
ViewData[“SaveMessage”]=“未成功更新密钥。”;
}
返回Json(新的{success=true,value=ViewData[“SaveMessage”]},JsonRequestBehavior.AllowGet);
}
这就是我为同样的目的编写的TESTMETHOD
[TestMethod]
public void MockAlways()
{
var mock = new Mock<AccountController>();
JsonResult json = new JsonResult();
//new { success = true, value = ViewData["SaveMessage"] }, JsonRequestBehavior.AllowGet
json.Data = new { success = true, value = "sa" };
json.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
mock.Setup(x => x.SaveMasterKeys("ss", 1)).Returns(json);
var controller = new AccountController();
var result = controller.SaveMasterKeys("ss", 1) as JsonResult;
Assert.AreEqual(mock.Object.SaveMasterKeys("ssxs", 1), result.Data.ToString());
}
[TestMethod]
公共图书馆
{
var mock=new mock();
JsonResult json=新的JsonResult();
//新建{success=true,value=ViewData[“SaveMessage”]},JsonRequestBehavior.AllowGet
json.Data=new{success=true,value=“sa”};
json.JsonRequestBehavior=JsonRequestBehavior.AllowGet;
Setup(x=>x.SaveMasterKeys(“ss”,1)).Returns(json);
var controller=new AccountController();
var result=controller.savemasterkey(“ss”,1)作为JsonResult;
Assert.AreEqual(mock.Object.SaveMasterKeys(“ssxs”,1),result.Data.ToString());
}
我收到一个无效的安装错误。有没有办法解决这个错误?我认为您误解了如何模拟控制器的动作。您正在模拟它,然后将其与模拟的控制器进行比较。这不是一种方法(就像检查
true==true
)
基本上,这个错误意味着Moq不能覆盖非虚拟成员(这是不言自明的)。您应该将方法的签名更改为virtual
,以允许覆盖它
但是-您不应该像这样模拟操作。相反,您应该模拟其依赖项(服务、上下文、网关等),并检查使用已知输入值是否可以在不模拟操作本身的情况下获得预期结果。您可以提供错误详细信息吗?确实是-在非虚拟设备上设置无效(可在VB中重写)member:x=>x.SaveMasterKeys(“ss”,1)。谢谢。我尝试过了,不再出现错误。我还有一个问题:我们可以模拟一个动作方法,还是需要一个接口或依赖项来模拟?@rohitraina,正如我提到的-你不应该模拟动作,你应该模拟它的依赖项(在你的例子中
AWSS3File
)。您可以将它们移动到构造函数并放置在字段中。