Gita Padhihari Ответов: 2

Во время выполнения тестового проекта получение system.nullreferenceexception: ссылка на объект не установлена на экземпляр объекта.


Это тестовый проект
public class UnitTest1
    {

        //private ProductRepository<iproductrepository> repository;
        //private ProductRepository<iproductdaterepository> productDateRepositor;
        private IProductRepository productRepository;
        private IProductDateRepository productDateRepository;
        public ProductController productController;
        List<productmodel> list;

        [TestInitialize]
        public void setUpController()
        {
            //repository = new ProductRepository<iproductrepository>();
            //productDateRepositor = new ProductRepository<iproductdaterepository>();
            productController = new ProductController(productRepository, productDateRepository);
            list = new List<productmodel>()
            {
                 new ProductModel(){Id=1,tickersymbol = "AAP", Price = 11100 ,Date=DateTime.Parse("12/25/2018") },
                new ProductModel(){Id=2,tickersymbol = "DAL", Price = 22200,Date=DateTime.Parse("11/27/2018")},
                new ProductModel(){Id=3,tickersymbol = "GE", Price = 33300,Date=DateTime.Parse("12/26/2018")},
                new ProductModel(){Id=4,tickersymbol = "AMZN", Price = 44400,Date=DateTime.Parse("11/27/2018")},
                new ProductModel(){Id=5,tickersymbol = "FNB", Price = 55500,Date=DateTime.Parse("12/28/2018")},
            };


        }
        [TestMethod]
        public void Index()
        {
            

            //Arrange
            var controller = productController;
            //Act
            
            var result = controller.Index("AAP") as ViewResult;
            var tickerdetails = (ProductModel)result.ViewData.Model;

            //Assert
            Assert.AreEqual("AAP",tickerdetails.tickersymbol );
            
        }


Во время выполнения этого я получаю сообщение: тестовый метод UnitTestProject2.UnitTest1.Index выбросил исключение:
System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта.

Что я уже пробовал:

Это и есть хранилище
public class ProductRepository : IProductRepository,IProductDateRepository
    {
        private List<productmodel> _products;

        public ProductRepository()
        {
            _products = new List<productmodel>()
            {
                // Add products for the Demonstration
                new ProductModel(){Id=1,tickersymbol = "AAP", Price = 11100 ,Date=DateTime.Parse("12/25/2018") },
                new ProductModel(){Id=2,tickersymbol = "DAL", Price = 22200,Date=DateTime.Parse("11/27/2018")},
                new ProductModel(){Id=3,tickersymbol = "GE", Price = 33300,Date=DateTime.Parse("12/26/2018")},
                new ProductModel(){Id=4,tickersymbol = "AMZN", Price = 44400,Date=DateTime.Parse("11/27/2018")},
                new ProductModel(){Id=5,tickersymbol = "FNB", Price = 55500,Date=DateTime.Parse("12/28/2018")},

            };
        }

        public IEnumerable<productmodel> GetPrice(string Name, DateTime? Date)
        {
            if (Date != null && Name!="")
            {
                var product = _products.Where(x => x.tickersymbol.StartsWith(Name) && x.Date == Date).ToList();
                return product;
            }
            else
            {
                return _products.ToList();
            }
        }

        ProductModel IProductRepository.Get(int id)
        {
            return _products.Find(p => p.Id == id);
        }

        IEnumerable<productmodel> IProductRepository.GetAll(string Name)
        {
            if (Name != "")
            {
                var product = _products.Where(x => x.tickersymbol.StartsWith(Name) || Name == null).ToList();
                return product;
            }
            else
            {
                return _products.ToList();
            }

        }

        IEnumerable<productmodel> IProductRepository.GetAll()
        {
            return _products.ToList();
        }


    }

Controller
public class ProductController : Controller
    {
        private readonly IProductRepository _repository;
        private readonly IProductDateRepository _productDateRepository;
        
        public ProductController(IProductRepository repository, IProductDateRepository productDateRepositor)
        {
            _repository = repository;
            _productDateRepository = productDateRepositor;
        }


        public ActionResult Index()
        {

            var model = _repository.GetAll();
            return View(model);
        }
        [HttpPost]
        public ActionResult Index(string Name)
        {
            
                var model = _repository.GetAll(Name);
                return View(model);
            
        }

        
        public ActionResult Details(string Name, DateTime? Date)
        {
           var model = _productDateRepository.GetPrice(Name, Date);
         
            return View(model);
        }
  Unit test file
<pre>[TestClass]
    public class UnitTest1
    {

        //private ProductRepository<iproductrepository> repository;
        //private ProductRepository<iproductdaterepository> productDateRepositor;
        private IProductRepository productRepository;
        private IProductDateRepository productDateRepository;
        public ProductController productController;
        List<productmodel> list;

        [TestInitialize]
        public void setUpController()
        {
            //repository = new ProductRepository<iproductrepository>();
            //productDateRepositor = new ProductRepository<iproductdaterepository>();
            productController = new ProductController(productRepository, productDateRepository);
            list = new List<productmodel>()
            {
                 new ProductModel(){Id=1,tickersymbol = "AAP", Price = 11100 ,Date=DateTime.Parse("12/25/2018") },
                new ProductModel(){Id=2,tickersymbol = "DAL", Price = 22200,Date=DateTime.Parse("11/27/2018")},
                new ProductModel(){Id=3,tickersymbol = "GE", Price = 33300,Date=DateTime.Parse("12/26/2018")},
                new ProductModel(){Id=4,tickersymbol = "AMZN", Price = 44400,Date=DateTime.Parse("11/27/2018")},
                new ProductModel(){Id=5,tickersymbol = "FNB", Price = 55500,Date=DateTime.Parse("12/28/2018")},
            };


        }
        [TestMethod]
        public void Index()
        {
            

            //Arrange
            var controller = productController;
            //Act
            
            var result = controller.Index("AAP") as ViewResult;
            var tickerdetails = (ProductModel)result.ViewData.Model;

            //Assert
            Assert.AreEqual("AAP",tickerdetails.tickersymbol );
            
        }

Patrice T

Опишите "не работает"

OriginalGriff

"Это не работает" - одно из самых бесполезных описаний проблемы, которое мы получаем: оно абсолютно ничего не говорит нам о проблеме. Мы не знаем, получаете ли вы сообщение об ошибке, или неправильные данные, или даже что этот код успешно компилируется!
Помните, что мы не можем видеть ваш экран, получить доступ к вашему жесткому диску или прочитать ваши мысли - мы получаем только то, что вы печатаете для работы.
Итак, расскажите нам, что происходит, когда вы запускаете этот код, что вы ожидали, как вы проверили, что произошло. Помогите нам помочь вам!
Используйте виджет "улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

2 Ответов

Рейтинг:
2

Richard Deeming

Цитата:
//repository = new ProductRepository<iproductrepository>();
//productDateRepositor = new ProductRepository<iproductdaterepository>();
productController = new ProductController(productRepository, productDateRepository);
Наиболее вероятная причина заключается в том, что вы закомментировали строки, создающие репозиторий продуктов и репозиторий дат продуктов. В результате эти два поля являются null когда вы передадите их в ProductController конструктор. Этот конструктор не проверяет свои аргументы, и класс позже пытается получить доступ к члену одного из этих репозиториев.

Инициализируйте поля перед построением контроллера:
var productRepository = new ProductRepository();
repository = productRepository;
productDateRepositor = productRepository;
Кроме того, добавьте проверку аргументов в конструктор вашего контроллера:
public ProductController(IProductRepository repository, IProductDateRepository productDateRepositor)
{
    if (repository is null) throw new ArgumentNullException(nameof(repository));
    if (productDateRepositor is null) throw new ArgumentNullException(nameof(productDateRepositor));
    
    _repository = repository;
    _productDateRepository = productDateRepositor;
}

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


Рейтинг:
1