MSTest Asserts терпит неудачу с нулевой ссылкой - PullRequest
1 голос
/ 08 мая 2019

Попытка создать простой метод тестирования для проекта .NET 4.7 Framework.Все примеры предназначены для Core или более старых версий инфраструктуры MSTest.

Я могу пройти тест с простой проверкой возвращаемого объекта.Если я попробую что-нибудь более сложное, например, проверить количество возвращенных записей, тесты не пройдут, так как contentResult всегда будет иметь значение null.

Я указал, какие утверждения не выполняются.

using Locations.Api.Controllers;
using Locations.Api.Domain.Models;
using Locations.Api.Domain.Services.Interfaces;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using System.Collections.Generic;
using System.Web.Http;
using System.Web.Http.Results;

namespace Locations.Api.Tests
{
    [TestClass]
    public class TestLocationsController
    {
        [TestMethod]
        public void GetAllLocations_ShouldReturnAllLocations()
        {
            // Arrange
            List<Location> testLocations = GetTestLocations();

            Mock<ILocationsService> locationsServiceMock = new Mock<ILocationsService>();
            locationsServiceMock.Setup(location => location.GetAllLocations())
                        .Returns(testLocations);

            LocationsController controller = new LocationsController(locationsServiceMock.Object);

            // Act
            IHttpActionResult locations = controller.GetAllLocations();

            // Assert
            Assert.IsNotNull(locations, "locations is null");
            var contentResult = locations as OkNegotiatedContentResult<Location>;

            // THESE ALL FAIL
            Assert.IsInstanceOfType(locations, typeof(List<Location>), "Wrong Model");      // ERROR: type:<System.Collections.Generic.List`1[Locations.Api.Domain.Models.Location]>. Actual type:<System.Web.Http.Results.OkNegotiatedContentResult`1[System.Collections.Generic.List`1[Locations.Api.Domain.Models.Location]]>.

            Assert.IsNotNull(contentResult.Content, "contentResult is null");           // ERROR: System.NullReferenceException
            Assert.AreEqual(1, contentResult.Content.Id);                               // ERROR:  System.NullReferenceException
            Assert.AreEqual(2, locations.Count(), "Got wrong number of locations");     //  ERROR:  'IHttpActionResult' does not contain a definition for 'Count'
        }


        private static List<Location> GetTestLocations()
        {
            return new List<Location> {
                    new Location { Id = 1, Name = "Albuquerque", Category = "Terminal", Street = "301 Airport Road NW", City = "Albuquerque", State = "NM", ZipCode = "87121", Latitude = 35.0822720000M, Longitude = -106.7169960000M, NearestMajorCity = "Albuquerque", Phone1 = "(505) 344-1619", Phone2 = null, Avaya = null, GateCode = "1234", SpecificEntranceDirections = "Enter via front gate", SwiftCharitiesAmbassador = "Homer Simpson", Extras = "stuff" },
                    new Location { Id = 2, Name = "Columbus", Category = "Terminal", Street = "4141 Parkwest Drive", City = "Columbus", State = "OH", ZipCode = "43228", Latitude = 39.9668110000M, Longitude = -83.1153610000M, NearestMajorCity = "Cincinnati", Phone1 = "(614) 274-5204", Phone2 = null, Avaya = null, GateCode = "5678", SpecificEntranceDirections = "Enter on west side", SwiftCharitiesAmbassador = "Marge Simpson", Extras = "none" }
                };
        }
    }
}

1 Ответ

3 голосов
/ 08 мая 2019

Ваша первая ошибка в первом ошибочном утверждении показывает, почему это не работает: локации типа OkNegotiatedContentResult<List<Location>>, а не OkNegotiatedContentResult<Location>.

Поскольку вы используете безопасное приведение, as, а тип местоположения не OkNegotiatedContentResult<Location>, результат применения всегда будет нулевым.

Вы можете настроить код следующим образом:

var contentResult = locations as OkNegotiatedContentResult<List<Location>>;

Assert.IsNotNull(contentResult, "contentResult should not be null.");
Assert.IsInstanceOfType(contentResult.Content, typeof(List<Location>), "Wrong Model");      
Assert.IsNotNull(contentResult.Content, "contentResult.Content is null");           
Assert.AreEqual(1, contentResult.Content[0].Id);                               
Assert.AreEqual(2, contentResult.Content.Count, "Got wrong number of locations");    
...