Moq框架对返回任务的方法进行单元测试

问题描述 投票:1回答:1

我对这个最小起订量框架是陌生的,说实话,在不得不运行单元测试方面很难。基本上,我有一个C#应用程序,该应用程序基本上使用PostAsync将一些文件上传到API。

现在,由于我不能(也不应该)在单元测试期间调用该API(否则它将是一个集成测试),所以我在它周围添加了包装方法,并通过模拟使该方法返回true。但是无论我做什么,它都会返回false。我已经经历了一些问题,但是我不确定我缺少什么。我没有使用接口,但是正在使用带有虚方法的类。

这是我要测试的示例代码

public async Task<bool> CreateNoteBookDirectory (string url ,string bearertoken, JavaScriptSerializer jser,RestPostClass rest)
        {
            NoteBookDirectory jsnbdir = new NoteBookDirectory();
            jsnbdir.path = "/JobNotebooks/ClientScoreDataInput";

            var directorycreate = jser.Serialize(jsnbdir);
            var content = new StringContent(directorycreate, Encoding.UTF8, @"application/json");


            bool result=await rest.HttpPost(url, content, bearertoken);

            return result;
        }

此方法在主类中。

RestPostClass类具有虚拟方法HttpPost,其骨架与此类似

 public async virtual Task<bool> HttpPost(String url, StringContent content, string bearertoken)
        {
            HttpClient client = new HttpClient();
            client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", bearertoken);
            // Add an Accept header for JSON format.
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(@"application/json"));
            var postresult = await client.PostAsync(url, content);
            bool result = parseResponse(postresult);
            return result;
        }

现在,在我的单元测试中,我试图测试CreateNoteBookDirectory方法,并且由于不希望调用post方法,所以对其进行了模拟。

这是我在样本单元测试中的工作

 Mock<DataBricksRestPost> mock = new Mock<DataBricksRestPost>();
            mock.Setup(x => x.HttpPost("http://test.com", new StringContent("abc"), "token")).Returns(Task.FromResult(true));
            Program prog = new Program();
            var jser = new JavaScriptSerializer();
            bool result= await prog.CreateNoteBookDirectory("http://test.com", "token", jser, mock.Object);
            Assert.IsTrue(result, "Test failed");     

它一直返回false,因为显然模拟并没有真正发生。

我想念什么?

任何问题,我都会尽力澄清。

P.S:我基本上是在开始时就使用了现有的“程序”类。

c# .net unit-testing moq
1个回答
2
投票

Mock返回false,因为调用HttpPost时参数与设置的参数不匹配。第二个参数不同。

您可以这样设置模拟:

mock
    .Setup(x => x.HttpPost("http://test.com", It.IsAny<StringContent>(), "token"))
    .Returns(Task.FromResult(true)); //or .ReturnsAsync(true);

它告诉模拟框架,第二个参数可以是StringContent类型的任何对象。

文档可以在这里找到:https://github.com/Moq/moq4/wiki/Quickstart#matching-arguments

© www.soinside.com 2019 - 2024. All rights reserved.