Я, к сожалению, должен написать модульные тесты для унаследованной базы кода Sitecore MVC, где вызываются два разных контекста Sitecore. Я понимаю, что это относится к Интеграционному тестированию, но у меня нет возможности обучать своих лидеров проекта в этом направлении. Поэтому я решил использовать FakeDb для эмуляции экземпляра Sitecore и NSubstitute для замены введенных зависимостей (не могу использовать какие-либо рамки API Profilier, такие как MS Fakes, TypeMock и т. Д. Из-за бюджетных ограничений). Я предоставляю код ниже:
Метод для UnitTested
public bool DubiousMethod()
{
// This HttpContext call is pain area 1. This gets resolved when i call it using ItemContextSwitcher in Unit Tests.
string currentUrl = HttpContext.Current.Request.RawUrl;
// This Sitecore Context call to Site Name is pain area 2. This gets resolved when Unit Tests are run under SiteContextSwitcher.
string siteName = Sitecore.Context.Site.Name;
return true/False;
}
Метод модульного тестирования
[Fact]
public void DubiousMethodUT()
{
// create a fake site context
var fakeSite = new Sitecore.FakeDb.Sites.FakeSiteContext(
new Sitecore.Collections.StringDictionary
{
{ "name", "website" }, { "database", "web" }, { "rootPath", "/sitecore/content/home" },
{ "contentStartItem", "home"}, {"hostName","https://www.myorignalsiteurl.com"}
});
using (new Sitecore.Sites.SiteContextSwitcher(fakeSite))
{
//DubiousClassObject.DubiousMethod(home) // When Debugging after uncommenting this line i get correct value in **Sitecore.Context.Site.Name**
using (Sitecore.FakeDb.Db db = new Sitecore.FakeDb.Db
{
new Sitecore.FakeDb.DbItem("home") { { "Title", "Welcome!" } ,
new Sitecore.FakeDb.DbItem("blogs") }
})
{
Sitecore.Data.Items.Item home = db.GetItem("/sitecore/content/home");
//bool abc = confBlogUT.IsBlogItem(home);
using (new ContextItemSwitcher(home))
{
string siteName = Sitecore.Context.Site.Name;
var urlOptions = new Sitecore.Links.UrlOptions();
urlOptions.AlwaysIncludeServerUrl = true;
var pageUrl = Sitecore.Links.LinkManager.GetItemUrl(Sitecore.Context.Item, urlOptions);
HttpContext.Current = new HttpContext(new HttpRequest("", pageUrl.Substring(3), ""), new HttpResponse(new StringWriter()));
Assert.False(DubiousClassObject.DubiousMethod(home); //When Debugging after commenting above DubiousMethodCall i get correct value for **HttpContext.Current.Request.RawUrl**
}
}
}
}
Как вы можете заметить, когда я пытаюсь вызвать метод из FakSiteContext, я получаю правильное значение для Sitecore.Context.Site.Name , однако мой код прерывается, когда HttpContext.Current.Request.RawUrl вызывается в методе. Противоположное случается, когда я вызываю метод из ContextItemSwitcher (FakeItem) context. До сих пор я не смог найти способ объединить оба контекста (что я считаю невозможным в Sitecore). Может кто-нибудь предложить, если я запускаю свои модульные тесты в всеобъемлющем контексте, где я могу контролировать переменные fakeSite, а также переменные контекста FakeItem, а также расширения любых других вызовов контекста Sitecore?
Любая помощь будет принята.