Untitesting /起订量方法调用的WebRequest(Untitesting/Moq me

2019-10-16 21:07发布

我想测试通过的WebRequest发送文本类,我怎么能使用起订量嘲笑的GetRequest梅索德,测试的GetRequest?

public class Sender

public void Send(string Message)
{
...
WebRequest myReq = GetRequest(sParmeter);
}

protected WebRequest GetRequest(string URl)
        {
            return WebRequest.Create(URl);
        }
}

Answer 1:

一,我要去的方式表明的是一样的AD.Net的反应,但如果你不希望修改现有的结构,仍然考验你可以做类似如下:

修改原来的类,如下所示:

public class Sender
{
    public void Send(string Message)
    {
    ...
        WebRequest myReq = GetRequest(sParmeter);
    }

    protected virtual WebRequest GetRequest(string URl)
    {
        return WebRequest.Create(URl);
    }
}

并在测试项目中扩展这个类,如下所示:

public class MockSender: Sender
{
    private WebRequest _response;
    public MockSender(WebRequest response)
    {
    _response=response;       //initialize data to be returned
    }
    protected override WebRequest GetRequest(string URl)
    {
        //return your test;
    }
}

现在在您的测试创造型MockSender的实例,并调用发送方法就可以了。

起订量预计你的类是抽象的,或者你实现一个接口,因此嘲笑这是什么AD.Net描述了接口

希望这可以帮助..



Answer 2:

对于这样的事情,简单的办法是将你WebRequest实例及其操作的接口中介落后。

例:

public interface IWebRequestHandler
{
WebRequest GetRequest (string URI);
}

public class WebRequestHandler : IWebRequestHandler
{
public WebRequest GetRequest (string URI)
{
return WebRequest.Create(URl);
}
} 

你的发送者类应具有的注射实例IWebRequestHandler ,你可以嘲笑它MOQ ,建立expctations,验证它被调用和其他任何你可能想。

public class Sender
{
public IWebRequestHandler Handler{get;set;}
public void Send(string Message)
{
Handler.GetRequest(new URI(Message));//call the method with right params, just an example
}
}


Answer 3:

另一种方法是通过IWebRequestCreate方法在给构造。

    public HTTPRequestFactory(IWebRequestCreate create)
    {
        _IWebRequestCreate = create;

    }

    public HTTPRequestFactory()
    {
        //Do nothing this is the real constructor, above is just for testing.
    }

    public WebRequest Create(String uri)
    {
        Uri _uri = new Uri("http://"+this.address+uri);
        request =  (HttpWebRequest)this.Create(_uri);
        return request;
    }

    public WebRequest  Create(Uri uri)
        if (null == _IWebRequestCreate)
        {
            //use the real one
            request = WebRequest.Create(uri);
        }
        else
        {
            //testing so use test one
            request = _IWebRequestCreate.Create(uri);
        }
        return request;
    }

}然后你可以使用一个标准的测试,以确认它被称为像你想要的。

        [Test]
    public void NewwebrequestCreatesWebRequest()
    {
        var mockCreate = new Mock<IWebRequestCreate>();
        mockCreate.Setup(x => x.Create(It.IsAny<Uri>()));
        HTTPRequestFactory webrequest = new HTTPRequestFactory(mockCreate.Object);
        HttpWebRequest request = (HttpWebRequest)webrequest.Create(testURI);
        mockCreate.VerifyAll();       
    }

    [Test]
    public void webrequestUsesAddressProperty()
    {
        var mockCreate = new Mock<IWebRequestCreate>();
        string IP = "10.99.99.99";
        Uri expected = new Uri("http://10.99.99.99/services");
        mockCreate.Setup(x => x.Create(expected));
        HTTPRequestFactory webrequest = new HTTPRequestFactory(mockCreate.Object);
        webrequest.address = IP;
        HttpWebRequest request = (HttpWebRequest)webrequest.Create(testURI);
        mockCreate.VerifyAll();
    }

究其原因有两个创建函数是要在一个字符串传递创建(串)和IWebRequestCreate需要创建(URI)。

编辑,因为标准扶养注射不IWebRequestCreate工作。 标准模式是实例化对象与所述接口和在使其通过的构造。 由于WebRequest的不能用构造函数创建和接口canot被实例化,上述逻辑的工作解决这一问题。



文章来源: Untitesting/Moq method calling webrequest
标签: c# moq