C# 我怎么能模仿这个代码?
我想开始模仿一些代码,但我不知道如何去做。我读过一些教程,但我无法将其应用到我的代码中(这可能是有原因的)。 我正在使用NUnit和Moq。 (我已经删除了所有其他方法,所以我可以向您展示一个) Api接口:C# 我怎么能模仿这个代码?,c#,unit-testing,mocking,nunit,moq,C#,Unit Testing,Mocking,Nunit,Moq,我想开始模仿一些代码,但我不知道如何去做。我读过一些教程,但我无法将其应用到我的代码中(这可能是有原因的)。 我正在使用NUnit和Moq。 (我已经删除了所有其他方法,所以我可以向您展示一个) Api接口: public interface IApiRequest { Task<T> ExecuteAsync<T>(RestRequest request); } 公共接口IApiRequest { 任务执行同步(重新请求请求); } 我要模拟的方法: pub
public interface IApiRequest
{
Task<T> ExecuteAsync<T>(RestRequest request);
}
公共接口IApiRequest
{
任务执行同步(重新请求请求);
}
我要模拟的方法:
public async Task<UpcomingMovies> GetUpcomingMovies(int page)
{
var request = new RestRequest
{
Resource = "movie/upcoming",
};
request.AddParameter("page", page.ToString());
request.AddParameter("language", "en");
var api = new ApiRequest();
return await api.ExecuteAsync<UpcomingMovies>(request);
}
公共异步任务GetUpcomingMovies(int页)
{
var请求=新的重新请求
{
Resource=“电影/即将上映”,
};
request.AddParameter(“page”,page.ToString());
请求。添加参数(“语言”、“英语”);
var api=新的apirest();
返回等待api.ExecuteAsync(请求);
}
我不知道我怎么能嘲笑这个
更新:
现在这是一个有效的测试吗
Mock<IApiRequest> mock = new Mock<IApiRequest>();
mock.Setup(x => x.ExecuteAsync<UpcomingMovies>(It.IsAny<RestRequest>()))
.Returns(Task.FromResult<UpcomingMovies>(new UpcomingMovies()));
Mock Mock=new Mock();
mock.Setup(x=>x.ExecuteAsync(It.IsAny()))
.Returns(Task.FromResult(newupComingMovies());
如果要模拟ExecutAsync
方法,可以这样做:
Mock<IApiRequest> mock = new Mock<IApiRequest>();
mock.Setup(x => x.ExecuteAsync<UpcomingMovies>(It.IsAny<RestRequest>()))
.Returns(Task.FromResult<UpcomingMovies>(/** whatever movies **/));
public class MyClass
{
public MyClass(IApiRequest api)
{
this.api = api;
}
public async Task<UpcomingMovies> GetUpcomingMovies(int page)
{
var request = new RestRequest
{
Resource = "movie/upcoming",
};
request.AddParameter("page", page.ToString());
request.AddParameter("language", "en");
return await api.ExecuteAsync<UpcomingMovies>(request);
}
}
Mock Mock=new Mock();
mock.Setup(x=>x.ExecuteAsync(It.IsAny()))
.Returns(Task.FromResult(/****/);
如果要模拟particlur请求,请将It.IsAny()
替换为对请求的引用
要有效地测试您的类,您需要以下内容:
Mock<IApiRequest> mock = new Mock<IApiRequest>();
mock.Setup(x => x.ExecuteAsync<UpcomingMovies>(It.IsAny<RestRequest>()))
.Returns(Task.FromResult<UpcomingMovies>(/** whatever movies **/));
public class MyClass
{
public MyClass(IApiRequest api)
{
this.api = api;
}
public async Task<UpcomingMovies> GetUpcomingMovies(int page)
{
var request = new RestRequest
{
Resource = "movie/upcoming",
};
request.AddParameter("page", page.ToString());
request.AddParameter("language", "en");
return await api.ExecuteAsync<UpcomingMovies>(request);
}
}
公共类MyClass
{
公共MyClass(IApiRequest api)
{
this.api=api;
}
公共异步任务GetUpcomingMovies(int页)
{
var请求=新的重新请求
{
Resource=“电影/即将上映”,
};
request.AddParameter(“page”,page.ToString());
请求。添加参数(“语言”、“英语”);
返回等待api.ExecuteAsync(请求);
}
}
测试
[Test]
public async Task MyTest()
{
var expectedMovies = new UpcomingMovies(); // or whatever movies you need
Mock<IApiRequest> mock = new Mock<IApiRequest>();
mock.Setup(x => x.ExecuteAsync<UpcomingMovies>(It.IsAny<RestRequest>()))
.Returns(Task.FromResult<UpcomingMovies>(expectedMovies));
var myClass = new MyClass(mock.Object);
var result = await myClass.GetUpcomingMovies(1);
Assert.IsTrue(expectedMovies == result);
}
[测试]
公共异步任务MyTest()
{
var expectedMovies=new UpcomingMovies();//或任何您需要的电影
Mock Mock=新Mock();
mock.Setup(x=>x.ExecuteAsync(It.IsAny()))
.Returns(Task.FromResult(expectedMovies));
var myClass=新的myClass(mock.Object);
var result=await myClass.GetUpcomingMovies(1);
Assert.IsTrue(expectedMovies==result);
}
这是一个有效的模拟,但是您需要从您的测试方法调用GetUpcomingMovies
,它需要是async
Ok,但是我该如何调用它呢?如果我调用它,那么mock就不会做任何事情了?我添加了一个示例测试,希望它能有所帮助。这是一个很好的示例。非常感谢你,内德,这让我明白了它是如何更好地工作的!您不应该新建api,因为您不能在测试中模拟它。最好传入构造函数,以便在测试中可以传入模拟。