如何模拟 UmbracoContext 进行单元测试?

问题描述 投票:0回答:1

我正在使用 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);
unit-testing umbraco rhino-mocks
1个回答
0
投票

互联网上的文章并不能真正帮助模拟 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.