Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Moq创建具有构造函数的模拟类型_C#_.net_Unit Testing_Mocking_Moq - Fatal编程技术网

C# 使用Moq创建具有构造函数的模拟类型

C# 使用Moq创建具有构造函数的模拟类型,c#,.net,unit-testing,mocking,moq,C#,.net,Unit Testing,Mocking,Moq,我刚刚开始在一个简单的方法上进行单元测试,我被困在下面一行(特别是web服务对象): 起初,我尝试使用接口来模拟HttpContext调用,但我在这方面遇到了困难,所以我想知道是否可以模拟web服务?类似于下面的内容,但是我不知道如何将这个模拟对象“注入”到getToken方法/类中 var webServiceMock = new Mock<WebService>("http://test.example.com", "/test/file/path"); //maybe some

我刚刚开始在一个简单的方法上进行单元测试,我被困在下面一行(特别是web服务对象):

起初,我尝试使用接口来模拟HttpContext调用,但我在这方面遇到了困难,所以我想知道是否可以模拟web服务?类似于下面的内容,但是我不知道如何将这个模拟对象“注入”到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);
类的较大片段以供参考:

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);
模拟测试:

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

Moq模拟接口的方法和属性。只有接口的具体实现才有构造函数。所以,创建一个接口,您的服务将实现并模拟它。所以,如果我想模拟这些对象,每个对象都需要一个带有测试和非测试实现的接口?所有这些都需要作为类本身的构造函数参数添加?您可以有一个接口,并以各种方式实现它,比如说真实实现和测试/存根实现。或者是后面的一个-只是模拟这个接口。如果字段是对ws的后续调用以获取和设置,那么可以向接口添加字段吗?请详细说明。接口是一个契约,它通常只有方法,很少有属性。听起来您想创建一个存根实现:您将某个内容传递给它的ctor,进行调用,它将返回您传递的内容。这是一种选择。另一种方法是使用Setup()和Moq中的Return()。
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
    }
}
var mock = new Mock<ITokenProvider>();
mock.Setup(m => m.GetToken()).Returns("test-token-1");