【问题标题】:Moq.Mock Exception with invocation failed with mock behavior strictMoq.Mock 异常调用失败,模拟行为严格
【发布时间】:2016-11-29 11:45:19
【问题描述】:

我是 Moq 框架的新手,我编写了一个测试方法,但出现以下错误。我找不到我错过的地方。

有人可以告诉我如何纠正以下错误吗?


在 Moq.dll 中发生了“Moq.MockException”类型的异常,但 未在用户代码中处理

附加信息:IResponseMessage.ReadContentAsString() 调用失败,模拟行为 Strict。

mock 上的所有调用都必须有相应的设置。

Execp.cs

public Execp(IResponseMessage msg)  
{

    this.StatusCode = msg.StatusCode;//*getting exception here while running **method 1***
    this.ReadContentAsString = msg.ReadContentAsString();//*getting exception here while running **method 2***


}

我的测试方法

方法一

[TestMethod()]        
public void TestFail()
{

    int employeeId = 0;

    DataModel.Employee.Get.Employee employee= new DataModel.Employee.Get.Employee();
    string url = string.Format("api/1/somename/{0}", employeeId);

    restClient
        .Setup(x => x.Get(url))
        .Returns(responseMessage.Object);

    responseMessage.SetupGet(x => x.IsSuccessStatusCode).Returns(false);

    var client = new account(clientFactory.Object, serverUri, moqLogged.Object);
    var result = client.GetEmployee(employeeId);
    Assert.AreEqual(result, null);

    client.Dispose();
    moqFactory.VerifyAll();
}

方法二

[TestMethod()]
public void TestBadRequest()
{

   var httpStatusCode = System.Net.HttpStatusCode.BadRequest;

    string employeeName = "Test Name";
    int teamLeaderId= 1;
    string url = string.Format("api/1/somename/{0}/teammember", teamLeaderId);
    DataModel.Group.Post.TeamMember employee= new DataModel.Group.Post.teamMember();

    UserResponse userResponse = new UserResponse();

    restClient
        .Setup(x => x.PostAsJson(url, It.IsAny<DataModel.Employee.Post.TeamMember>()))
        .Returns(responseMessage.Object);

    responseMessage.SetupGet(x => x.IsSuccessStatusCode).Returns(false);
    responseMessage.SetupGet(x => x.StatusCode).Returns(httpStatusCode);

    var client = new AcronisAccountManagementClient(clientFactory.Object, serverUri, moqLogged.Object);

    var result = client.CreateEmployee(employee, teamLeaderId);
    Assert.AreEqual(result.statusCode, httpStatusCode);

    client.Dispose();
    moqFactory.VerifyAll();
}

【问题讨论】:

    标签: c# unit-testing moq


    【解决方案1】:

    你创建了一个Mock&lt;IResponseMessage&gt;,默认使用MockBehavior.Strict

    MockBehavior.Strict :使模拟总是抛出异常调用 没有对应的设置。

    您在代码中的某处调用未配置设置的成员。我建议为您打算在测试期间调用的所有成员创建一个设置

    对于方法 1 和 2:

    //...other code removed for brevity
    
    var httpStatusCode = System.Net.HttpStatusCode.BadRequest;//or what ever you want it to be
    responseMessage.Setup(m => m.StatusCode).Returns(httpStatusCode);
    responseMessage.Setup(m => m.ReadContentAsString()).Returns("Put your return string here");
    
    //...other code removed for brevity
    

    【讨论】:

    • 你是最棒的。谢谢。
    • 虽然这似乎是真的,但为什么只有一些模拟似乎关心这个设置?我没有使用 Setup 设置我的大部分方法,但是,一个特别的模拟确实在一个极端情况下关心这一点。
    猜你喜欢
    • 1970-01-01
    • 2015-11-30
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多