Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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# 我怎么能模仿这个代码?_C#_Unit Testing_Mocking_Nunit_Moq - Fatal编程技术网

C# 我怎么能模仿这个代码?

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

我想开始模仿一些代码,但我不知道如何去做。我读过一些教程,但我无法将其应用到我的代码中(这可能是有原因的)。 我正在使用NUnit和Moq。 (我已经删除了所有其他方法,所以我可以向您展示一个)

Api接口:

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,因为您不能在测试中模拟它。最好传入构造函数,以便在测试中可以传入模拟。