Sitecore FakeDB - Mocking GetCurrentItem <MyModel>() - PullRequest
0 голосов
/ 12 февраля 2019

Я столкнулся с проблемой модульного тестирования моего контроллера: логика довольно проста: контроллер извлекает элемент контекста, используя функцию GetCurrentItem (), и, основываясь на значении одного из полей, вызывает репозиторий.

Код моего модульного теста основан на комбинации:

  • Заменитель
  • NUnit
  • FluentAssertions
  • FakeDb
  • GlassMapper

Я пытался создать заменитель ISitecoreContext и использовал using(RenderingContext.EnterContext(new Rendering(), myItem)), но тест продолжает выдавать исключение нулевой ссылки, когда мой контроллер достигает GetCurrentItem().Если я проверяю код, то также Sitecore.Context.Item отображается как ноль.

Если я использую Sitecore.Data.DatabaseSwitcher, я вижу заполненный Sitecore.Context.Item, но Glass по-прежнему не может выполнить получение текущего элемента.

Можете ли вы помочь мне понять, что я делаю неправильно?Это мой код:

 public void ListWithFiltersShouldReturnPartialWithSeoItemAttributes(Db db, string itemName, ID itemId, string filterChanged)
        {
            //Arrange
            var repositorySubstitute = Substitute.For<IProductRepository>();
            var seoDataRepository = Substitute.For<ISeoDataRepository>();
            var item = new DbItem(itemName, itemId, new ID(Constants.ProductListingPageTemplate))
            {{ ProductListingPageConstants.UseSEOItemCopyFieldName, "true" }};

            db.Add(item);
            SetupSeoItem(seoDataRepository, item);

            var contextItem = db.GetItem(itemId);

            using (var controller = new TestableProductController(repositorySubstitute, seoDataRepository))
            {
                var context = new RenderingContext { Rendering = new Rendering { Item = contextItem } };
                ContextService.Get().Push(context);

                SearchSetting searchSetting = new SearchSetting() { SortBy = "A-Z" };
                if (db != null)
                {
                    repositorySubstitute.GetProductListWithFilters(db.GetItem(item.ID), searchSetting).ReturnsForAnyArgs(new ProductListModel() { SearchSetting = searchSetting });
                }

                var contextMock = Substitute.For<HttpContextBase>();
                var requestMock = Substitute.For<HttpRequestBase>();
                var queryString = new NameValueCollection();
                queryString["foo"] = "bar";
                requestMock.QueryString.Returns(queryString);
                contextMock.Request.Returns(requestMock);

                controller.ControllerContext = new ControllerContext(contextMock, new RouteData(), controller);

                //Act - This breaks. The ListWithFilters function calls the Glass GetContextItem()
                ActionResult plp = controller.ListWithFilters(searchSetting,filterChanged);

                //Assert      
                plp.Should().BeOfType<PartialViewResult>(); 
                }
         }

Большое спасибо!

A

...