模拟Request.UserHostAddress用于WEB API的单元测试

时间:2019-01-09 06:16:41

标签: c# asp.net-mvc unit-testing moq

我正在为我的WEB API服务编写单元测试。我想模拟来自IP地址的请求。我正在使用Microsoft单元测试。

[TestClass]
public class UnitTest1
{
    private Mock<HttpContextBase> moqContext;
    private Mock<HttpRequestBase> moqRequest;

    [TestMethod()]
    public void TestMethod1()
    {
       var controller = new TestController();
        controller.ControllerContext = new ControllerContext(moqContext.Object, new System.Web.Routing.RouteData(), controller);

    }
    [TestInitialize]
    public void SetupTests()
    {
        // Setup Moq
        moqContext = new Mock<HttpContextBase>();
        moqRequest = new Mock<HttpRequestBase>();
        moqContext.Setup(x => x.Request).Returns(moqRequest.Object);
        moqContext.Setup(x => x.Request.UserHostAddress).Returns("192.111.1.1");
    }

}

我不知道该如何进行进一步操作,我正在出错。

> Severity  Code    Description Project File    Line    Suppression State
> Error CS1503  Argument 3: cannot convert from
> 'WebApplication1.Controllers.TestController' to
> 'System.Web.Mvc.ControllerBase'   UnitTestProject1

任何帮助表示赞赏。 MOQ是否比Rino更好,而且是避免使用虚拟方法进行MOQ测试的替代方法。

更新 好的,因此控制器是如下所示的API控制器

// GET: api/Test
        public IEnumerable<string> Get()
        {
            string s =HttpContext.Current.Request.UserHostAddress;
             ...Authentication/Authorization based on IP address
            return new string[] { s };
        }

我想在单元测试中模拟HttpContext.Current.Request.UserHostAddress,以便测试其他IP地址。我的问题是如何设置模拟IP地址。我找到了一个链接https://blog.slatner.com/geeky/mocking-request-userhostaddress-in-asp-net-mvc.html。但我不知道如何使用。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

这意味着您的TestController类不会继承自System.Web.Mvc.ControllerBase。因此,请返回您的TestController的定义,并确保它看起来像

public class TestController: System.Web.Mvc.ControllerBase
{ /* your code here */ }

答案 1 :(得分:0)

您是否尝试过设置模拟 request 对象?

// moqContext.Setup(x => x.Request.UserHostAddress).Returns("192.111.1.1");  <-- not this
moqRequest.Setup(x => x.UserHostAddress).Returns("192.111.1.1")