【问题标题】:Best way to test Get() method of controller测试控制器的 Get() 方法的最佳方法
【发布时间】:2018-07-04 20:54:01
【问题描述】:

我有以下带有 get() 方法的构造函数,我需要通过 NUnit 测试该方法是否正常工作。

public ConsumersController(IProvider<Consumer> provider)
{
  this.provider = provider;
}

/// <summary>
/// Get the list of consumers that you are allowed to see and serve
/// </summary>
/// <response code="200">Returns the consumers you are allowed to see and serve</response>
[HttpGet]
[ProducesResponseType(typeof(IEnumerable<Consumer>), 200)]
[Produces(typeof(IEnumerable<Consumer>))]
[SwaggerResponse((int)HttpStatusCode.OK, Type = typeof(IEnumerable<Consumer>))]
public IEnumerable<Consumer> Get()
{
  return this.provider.GetAll();
}

我根据这个链接Testing controller logic in ASP.NET Core创建了这段代码,但是不知道对不对,测试没有通过。 提前致谢。

[TestFixture]
public class ConsumerTest
{
    private readonly HttpClient consumerHttp;

    private readonly ConsumersController consumerControl;

    [Test]
    public async Task Get_ConsumersController()
    {
        var result = this.consumerControl.Get();
        var response = await consumerHttp.GetAsync("http://localhost:9000/consumers");
        response.EnsureSuccessStatusCode();

        var consumerList = JsonConvert.DeserializeObject<IEnumerable<Consumer>>(await response.Content.ReadAsStringAsync());
        var consumerTest = consumerList.First();

        Assert.AreEqual(result.First().Name, consumerTest.Name);
    }
}

【问题讨论】:

  • 您能否详细说明测试未通过?你有不同的名字吗?有什么名字吗?我不是控制器动作测试方面的专家,但我不确定这是否真的是单元测试材料。只要控制器操作除了返回对象列表之外什么都不做,我宁愿测试您正在使用的 IProvider 实现。
  • 我发现您发布的代码存在两个问题。首先,ConsumersController 中的 Get 方法不是 async 方法。您的单元测试方法将其视为定义为async。第二个问题是我没有看到为您的控制器创建的 IProvider&lt;Consumer&gt; 模拟或对象。
  • 链接的文章涵盖单元测试和集成测试。您能否准确说明您指的是哪一个,因为目前这个问题太宽泛,我们无法为您提供任何有意义的帮助。

标签: c# unit-testing asp.net-core nunit


【解决方案1】:

感谢您的回答。事实上,它缺少使用 MOQ 库,并且使用 Async 时出现错误。我用这段代码得到了它。

[Test]
public void Get_ReturnsAConsumer_WithAListOfIProvider()
{
  var mockRepo = new Mock<IProvider<Consumer>>();
  mockRepo.Setup(repo => repo.GetAll()).Returns(GetConsumers());

  var controller = new ConsumersController(mockRepo.Object);
  var result = controller.Get();

  Assert.IsAssignableFrom<List<Consumer>>(result);
  Assert.AreEqual(1, result.Count());
}

【讨论】:

  • 在我的项目中,我使用 Moq 进行单元测试(控制器如何与其依赖项交互,不同场景中的状态代码)和使用 HttpClient 的功能测试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 2015-10-01
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多