Тестирование контроллеров стиля REST в ASP.Net Core - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь протестировать метод действия в основном проекте asp.net.Тест не пройден, когда я ожидаю, что он пройдет успешно.Кажется, что проблема связана с типом возврата метода Action.

Я также пытался протестировать метод в BusinessLogic с типом возвращаемого значения 'IEnumerable', который работает, как и ожидалось.Вот код, который я пытаюсь выполнить.

Контроллер / Метод действия:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    private IValueLogic _objValueLogic;
    public ValuesController(IValueLogic objValueLogic) {
        _objValueLogic = objValueLogic;
    }
    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        IEnumerable<string> allValues = _objValueLogic.GetAll();
        return new ActionResult<IEnumerable<string>>(allValues);
    }
}

Класс теста:

public class ValueApiTest
{
    private ValuesController _objValuesController;
    public ValueApiTest() {
        Mock<IValueLogic> mockValueLogic = new Mock<IValueLogic>();
        mockValueLogic.Setup(x => x.GetAll()).Returns(new string[] {"Value1", "Value2"});
        _objValuesController = new ValuesController(mockValueLogic.Object);
    }
    [Fact]
    public void GetAll_Success() {
        ActionResult<IEnumerable<string>> expected = new ActionResult<IEnumerable<string>>(new string[] {"Value1", "Value2"});
        ActionResult<IEnumerable<string>> actual = _objValuesController.Get();
        Assert.Equal<ActionResult<IEnumerable<string>>>(expected, actual);
    }
}

Я хочу, чтобы результат был как ожидаемый, так и ожидаемый.фактические значения равны, но это не с сообщением.Как видите, ожидаемые и фактические значения печатаются одинаково.

Starting test execution, please wait...
[xUnit.net 00:00:03.01]     Test.WebApi.ValueApiTest.GetAll_Success [FAIL]
Failed   Test.WebApi.ValueApiTest.GetAll_Success
Error Message:
 Assert.Equal() Failure
Expected: ActionResult`1 { Result = null, Value = ["Value1", "Value2"] }
Actual:   ActionResult`1 { Result = null, Value = ["Value1", "Value2"] }
Stack Trace:
   at Test.WebApi.ValueApiTest.GetAll_Success() in /home/saurabh/DevEnv/DotNetCore/dotnet-template/Test/Test.WebApi/ValueApiTest.cs:line 23

Total tests: 2. Passed: 1. Failed: 1. Skipped: 0.
Test Run Failed.
Test execution time: 4.5573 Seconds

1 Ответ

0 голосов
/ 02 января 2019

Вы сравниваете два ссылочных типа, которые будут одинаковыми, если они ссылаются на один и тот же объект, чего не происходит в этом случае.Вместо этого вы можете попробовать что-то вроде этого:

public class ValueApiTest
{
    private ValuesController _objValuesController;
    private string[] _expected = new string[] {"Value1", "Value2"};
    public ValueApiTest() {
        _expected = Mock<IValueLogic> mockValueLogic = new Mock<IValueLogic>();          
        mockValueLogic.Setup(x => x.GetAll()).Returns(expected);
        _objValuesController = new ValuesController(mockValueLogic.Object);
    }
   [Fact]
    public void GetAll_Success() {
        IEnumerable<string> actual = _objValuesController.Get().Value;
        Assert.Equal<IEnumerable<string>>(expected, actual);
    }
}

Конечно, этот тест не будет разбит, если ваш контроллер вернет какой-то другой объект, кроме ActionResult.Если вы хотите охватить это, вы можете изменить его на

[Fact]
public void GetAll_Success() {
    ActionResult<IEnumerable<string>> result = _objValuesController.Get();
    IEnumerable<string> actual = result.Value;
    Assert.Equal<IEnumerable<string>>(expected, actual);
}

Теперь проверка не будет выполнена, если ваш контроллер вернет что-либо кроме ActionResult<IEnumerable<string>>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...