简体   繁体   English

使用Moq通过构造函数创建模拟类型

[英]Using Moq to create a mock the type with constructor

I'm just getting started on unit testing on a simple method and I'm stuck on the below line (specifically the web service object): 我刚刚开始以一种简单的方法进行单元测试,并且停留在以下行(特别是Web服务对象)上:

public string GetToken()
{
    WebService ws = new WebService("https://example.com/", HttpContext.Current.Server.MapPath("~/Config/agent.txt"));

    Token token = ws.GetToken(name, values, stuff);
}

At first I tried to use an interface to mock the HttpContext call, but I had trouble going that route, so I'm wondering if I can just Mock the web service? 最初,我尝试使用接口来模拟HttpContext调用,但是在执行该路由时遇到了麻烦,所以我想知道是否可以仅模拟Web服务? Something like below, but then I don't know how to actually 'inject' this Mock object into the getToken method/class. 如下所示,但是后来我不知道如何将这个Mock对象实际“注入”到getToken方法/类中。

var webServiceMock = new Mock<WebService>("http://test.example.com", "/test/file/path");
//maybe something along this syntax?
webServiceMock.Setup(it => it.CreateGetMethod(uri)).Returns(mockWebService.Object);

I am working through your interface solution and I can't figure out how to setup the implementation for the token without a WebService. 我正在研究您的界面解决方案,但是我不知道如何在没有WebService的情况下为令牌设置实现。 It calls GetIssuedTokenType but that doesn't exist in WebServiceImpl 它调用GetIssuedTokenType,但WebServiceImpl中不存在

    public class TokenImpl : IToken
    {
        public Token getToken(WebService ws)
        {
             Token token = ws.GetIssuedTokenType(
                  "http://example.com",
                  "john.doe@example.com", values,
                  WebService.TokenType.EX20);

        return samlToken;
        }
     }

    public class WebServiceImpl : IWebService
    {

        public WebService getWebService()
        {
            WebService ws = new WebService("https://example.com", HttpContext.Current.Server.MapPath("~/Config/agent.txt"));
        return ws;
    }
}

A larger snippet of the class for reference: 该类的较大片段供参考:

WebService ws = new WebService("https://example.com", HttpContext.Current.Server.MapPath("~/Config/agent.txt"));
ws.BasicAuthUsername = "username";
ws.BasicAuthPassword = "pass1234";

SecurityToken token = ws.GetIssuedTokenType(audience, nameId, values, type);
interface ITokenProvider
{
    string GetToken();
}

public class WebTokenProvider
{
    public string GetToken
    {
        // your actual implementation
    }
}

Mock in tests: 模拟测试:

var mock = new Mock<ITokenProvider>();
mock.Setup(m => m.GetToken()).Returns("test-token-1");

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM