【问题标题】:I want to Create Xunit test for this controller. How can i do that我想为此控制器创建 Xunit 测试。我怎样才能做到这一点
【发布时间】:2019-06-14 10:04:10
【问题描述】:

我创建了一个小型的 xunit 测试用例,但我不知道如何创建这个控制器,我在下面提到。

    public class PropertyController : ControllerBase
    {
        private readonly IMediator _mediator;
        private readonly ILogger<PropertyController> _logger;

        public PropertyController(IMediator mediator, ILogger<PropertyController> logger)
        {
            _mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
            _logger = logger ?? throw new ArgumentNullException(nameof(logger));
        }
        public async Task<IActionResult> AddProperty([FromBody] AddPropertyCommand command)
        {
            bool commandResult = false;
            _logger.LogInformation(
                "----- Sending command: {CommandName} - {IdProperty}: {CommandId} ({@Command})",
                command.GetGenericTypeName(),
                nameof(command.ModifiedUserId),
                command.ModifiedUserId,
                command);
            commandResult = await _mediator.Send(command);
            if (!commandResult)
            {
                return BadRequest();
            }
            return Ok();
        }

我是这样创作的。我已经模拟了依赖项并为 add 命令创建了一个测试用例是否工作正常

public class PropertyControllerTest
    {
        private readonly PropertyController _it;
        private readonly Mock<IMediator> _mediatorMock;
        private readonly Mock<ILogger<PropertyController>> _loggerPropertycontrollerMock;

        public PropertyControllerTest()
        {
            _mediatorMock = new Mock<IMediator>();
            _loggerPropertycontrollerMock = new Mock<ILogger<PropertyController>>();
            _it = new PropertyController(_mediatorMock.Object, _loggerPropertycontrollerMock.Object);
        }
        [Fact]
        public void it_Should_add_information_successfully_and_returns_200_status_result()
        {
            //How can i write xunit test case. I'm creating like this
            _mediatorMock.Setup(x => x.Send().Returns(property);   
        }

【问题讨论】:

  • 你想通过这个动作方法测试什么?
  • 我想测试添加方法
  • 将您的测试用例代码包含为文本而不是图像(就像您对 PropertyController 类所做的那样)
  • 我添加了 propertyControllerTests 文件

标签: c# unit-testing testing xunit servicetestcase


【解决方案1】:

下面的测试涵盖了 200 状态结果 - 对错误请求的类似测试将非常相似。

[Fact]
public void it_Should_add_information_successfully_and_returns_200_status_result()
{
    // Arrange
    var expected = new AddPropertyCommand();
    _mediatorMock.Setup(x => x.Send(It.IsAny<AddPropertyCommand>())).Returns(true);

    // Act
    var actionResult = _it.AddProperty(expected);

    // Assert
    actionResult.ShouldBeAssignableTo<OkResult>();

    _mediatorMock.Verify(x => x.Send(expected));
}

注意actionResult.ShouldBeAssignableTo&lt;OkResult&gt;(); 是使用 Shouldly 断言框架编写的,您可以将其换成您喜欢的任何内容。 XUnit 中内置的代码是这样的:Assert.IsType(typeof(OkResult), actionResult);

【讨论】:

  • 非常感谢,但我收到错误错误:- 当前上下文中不存在名称“Arg”
  • 对不起 - It.IsAny&lt;AddPropertyCommand&gt;() 我在 Moq 和 NSubstitute 之间交换,总是把这些东西弄糊涂,我会更新我的答案
  • 太棒了!非常感谢。它工作正常。但我有疑问。这里我们模拟了两个依赖项,所以我们还必须在 Testcase 中设置其他依赖项?
  • 当使用 Moq 和模拟依赖方法调用将返回 null 如果没有设置告诉它不这样做。所以你只需要设置其他模拟调用,如果你 a) 你关心它需要做什么或 b) 不设置它会阻止你到达你想要测试的位。我建议只设置特定测试所需的东西,否则你的测试会变得更难维护和阅读。测试中的代码越少越好 - 通常!
猜你喜欢
  • 2022-11-09
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2012-08-18
相关资源
最近更新 更多