使用 Moq 创建带有构造函数的模拟类型
Using Moq to create a mock the type with constructor
我刚刚开始使用一个简单的方法进行单元测试,我被困在下面一行(特别是网络服务对象):
public string GetToken()
{
WebService ws = new WebService("https://example.com/", HttpContext.Current.Server.MapPath("~/Config/agent.txt"));
Token token = ws.GetToken(name, values, stuff);
}
起初我尝试使用一个接口来模拟 HttpContext 调用,但我在走那条路时遇到了麻烦,所以我想知道我是否可以只模拟 Web 服务?类似于下面的内容,但是我不知道如何将这个 Mock 对象 'inject' 实际 method/class。
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);
我正在研究您的接口解决方案,但我不知道如何在没有 Web 服务的情况下为令牌设置实现。它调用 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;
}
}
class 的较大片段供参考:
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");
我刚刚开始使用一个简单的方法进行单元测试,我被困在下面一行(特别是网络服务对象):
public string GetToken()
{
WebService ws = new WebService("https://example.com/", HttpContext.Current.Server.MapPath("~/Config/agent.txt"));
Token token = ws.GetToken(name, values, stuff);
}
起初我尝试使用一个接口来模拟 HttpContext 调用,但我在走那条路时遇到了麻烦,所以我想知道我是否可以只模拟 Web 服务?类似于下面的内容,但是我不知道如何将这个 Mock 对象 'inject' 实际 method/class。
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);
我正在研究您的接口解决方案,但我不知道如何在没有 Web 服务的情况下为令牌设置实现。它调用 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;
}
}
class 的较大片段供参考:
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");