Я столкнулся с проблемой модульного тестирования моего контроллера: логика довольно проста: контроллер извлекает элемент контекста, используя функцию 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