我正在使用 RhinoMocks 和 Umbraco 为 ASP.NET MVC 应用程序编写单元测试。为此,我需要模拟 UmbracoContext,因此在下面的代码中使用。 但 Umbraco.Core.ApplicationContext.Current 会抛出 ArgumentNullException。请提出解决方案:
var contextBase = MockRepository.GenerateMock<HttpContextBase>();
var request = MockRepository.GenerateMock<HttpRequestBase>();
var response = MockRepository.GenerateMock<HttpResponseBase>();
var session = MockRepository.GenerateMock<HttpSessionStateBase>();
var server = MockRepository.GenerateMock<HttpServerUtilityBase>();
contextBase.Stub(ctx => ctx.Request).Return(request);
contextBase.Stub(ctx => ctx.Response).Return(response);
contextBase.Stub(ctx => ctx.Session).Return(session);
contextBase.Stub(ctx => ctx.Server).Return(server);
var umbracoCtx = UmbracoContext.EnsureContext(contextBase, Umbraco.Core.ApplicationContext.Current);
互联网上的文章并不能真正帮助模拟 umbraco 上下文。 这就是我们使用 nSubstitute 完成的方法,但我确信您可以将其转换为其他模拟库
public static IUmbracoContextFactory GetIUmbracoContextFactory()
{
EnsureTestServicesForUmbraco();
//IUmbracoContext
var umbracoContext = Substitute.For<IUmbracoContext>();
_ = umbracoContext.CleanedUmbracoUrl.Returns(new Uri("http://example.com"));
_ = umbracoContext.OriginalRequestUrl.Returns(new Uri("http://example.com"));
_ = umbracoContext.Content.Returns(Substitute.For<IPublishedContentCache>());
_ = umbracoContext.Media.Returns(Substitute.For<IPublishedMediaCache>());
_ = umbracoContext.Domains.Returns(Substitute.For<IDomainCache>());
//media
var media = GetMediaWithCrops();
_ = umbracoContext.Media!.GetAtRoot().Returns(new[] { media });
//content
var root = Substitute.For<IPublishedContent>();
_ = umbracoContext.PublishedRequest.Returns(GetPublishedRequest(root));
_ = umbracoContext.Content!.GetAtRoot().Returns(new[] { root });
//IUmbracoContextFactory
var umbracoContextAccessor = new UmbracoContextTextAccessor(umbracoContext);
var reference = new UmbracoContextReference(umbracoContext, true, umbracoContextAccessor);
var factory = Substitute.For<IUmbracoContextFactory>();
_ = factory.EnsureUmbracoContext().Returns(reference);
return factory;
}
public static void EnsureTestServicesForUmbraco()
{
var umbracoContextAccessor = Substitute.For<IUmbracoContextAccessor>();
_ = umbracoContextAccessor.TryGetUmbracoContext(out _)
.Returns(x =>
{
x[0] = Substitute.For<IUmbracoContext>();
return true;
});
var serviceProvider = Substitute.For<IServiceProvider>();
var publishedUrlProvider = Substitute.For<IPublishedUrlProvider>();
_ = publishedUrlProvider.GetUrl(
Arg.Any<IPublishedContent>(),
Arg.Any<UrlMode>()).Returns(new Fixture().Create<Uri>().AbsoluteUri);
_ = publishedUrlProvider.GetMediaUrl(
Arg.Any<IPublishedContent>(),
Arg.Any<UrlMode>()).Returns(new Fixture().Create<Uri>().AbsoluteUri);
_ = serviceProvider
.GetService<IPublishedUrlProvider>()
.Returns(publishedUrlProvider);
var variationContextAccessor = Substitute.For<IVariationContextAccessor>();
_ = variationContextAccessor.VariationContext.Returns(new VariationContext("*"));
_ = serviceProvider
.GetService<IVariationContextAccessor>()
.Returns(variationContextAccessor);
_ = serviceProvider
.GetService<IPublishedModelFactory>()
.Returns(Substitute.For<IPublishedModelFactory>());
_ = serviceProvider
.GetService<IUserService>()
.Returns(Substitute.For<IUserService>());
_ = serviceProvider
.GetService<IUmbracoContextAccessor>()
.Returns(umbracoContextAccessor);
_ = serviceProvider
.GetService<ISiteDomainMapper>()
.Returns(Substitute.For<ISiteDomainMapper>());
_ = serviceProvider
.GetService<IExamineManager>()
.Returns(Substitute.For<IExamineManager>());
_ = serviceProvider
.GetService<IFileService>()
.Returns(Substitute.For<IFileService>());
_ = serviceProvider
.GetService<IOptions<WebRoutingSettings>>()
.Returns(Substitute.For<IOptions<WebRoutingSettings>>());
_ = serviceProvider
.GetService<IContentTypeService>()
.Returns(Substitute.For<IContentTypeService>());
_ = serviceProvider
.GetService<IPublishedValueFallback>()
.Returns(Substitute.For<IPublishedValueFallback>());
_ = serviceProvider
.GetService<IMediaTypeService>()
.Returns(Substitute.For<IMediaTypeService>());
_ = serviceProvider
.GetService<IMemberTypeService>()
.Returns(Substitute.For<IMemberTypeService>());
StaticServiceProvider.Instance = serviceProvider;
}
private static PublishedRequest GetPublishedRequest(IPublishedContent publishedContent)
{
return new PublishedRequest(
_fixture.Create<Uri>(),
_fixture.Create<string>(),
publishedContent,
_fixture.Create<bool>(),
Substitute.For<ITemplate>(),
Substitute.For<DomainAndUri>(
_fixture.Create<Domain>(),
_fixture.Create<Uri>()),
_fixture.Create<string?>(),
_fixture.Create<string>(),
_fixture.Create<int>(),
Substitute.For<IReadOnlyList<string>>(),
Substitute.For<IReadOnlyDictionary<string, string>>(),
_fixture.Create<bool>(),
_fixture.Create<bool>());
}
public static MediaWithCrops GetMediaWithCrops()
{
var publishedValueFallback = Substitute.For<IPublishedValueFallback>();
var publishedContent = Substitute.For<IPublishedContent>();
var image = Substitute.For<Image>(publishedContent, publishedValueFallback);
var imageCropperValue = Substitute.For<ImageCropperValue>();
var media = Substitute.For<MediaWithCrops>(
image,
publishedValueFallback,
imageCropperValue);
return media;
}