Добавьте ViewFolder в конфигурации для Spark в проекте модульного теста ASP.NET MVC - PullRequest
2 голосов
/ 11 ноября 2011

Я отправляю электронное письмо из моего приложения ASP.NET MVC, используя Spark View Engine, основанный на этом примере Эндрю Харламова.

Я настроил модульный тест, CanSendEmail, но мне нужно указать в конфиге папку просмотра. Я нашел документацию здесь , и примеры дают это:

<spark>
  <views>
    <add name="{any-unique-name}" 
        folderType="FileSystem|EmbeddedResource|VirtualPathProvider|Custom"
        type="{name, assembly of IViewFolder type}"
        constuctor-param-names="values"
        subfolder="{optional subfolder to target}"/>
  </views>
</spark>

Мой вопрос такой. Какой тип папки я использую и нужны ли мне какие-либо другие параметры. Мой тестовый продукт называется myProject.Tests, а мой веб-проект, содержащий представления, называется myProject.Web с папкой Views.

Использую ли я FileSystem, VirtualPathProvider ...?

Редактировать [14/11/2011]:

Хорошо, у меня есть это в моем app.config в myProject.Tests:

<views>
    <add name="web-view-folder"
                folderType="VirtualPathProvider"
                virtualBaseDir="~/Views"/>
</views>

Я все еще получаю "Просмотр исходного файла не найден". когда я запускаю тест Я хочу, чтобы тест использовал Представления в myproject.Web.

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

Мое решение

Основываясь на сообщениях в блоге здесь и здесь и с помощью @ RobertTheGrey и просмотрев тесты в исходном коде Spark, я в итоге используя ViewFolderType.FileSystem. Это сработало.

Вот мой тестируемый код:

public string RenderEmailWithCustomViewFolder(string sparkViewName, ViewDataDictionary viewData, Dictionary<string, string> viewFolderParameters)
{
    var settings = new SparkSettings()
        .SetPageBaseType(typeof (SparkView))
        .AddViewFolder(ViewFolderType.FileSystem, viewFolderParameters)
        .AddAssembly("MvcContrib");

    var engine = new SparkViewEngine(settings);


    var sparkViewDescriptor = new SparkViewDescriptor().AddTemplate(sparkViewName);
    var view = (SparkView)engine.CreateInstance(sparkViewDescriptor);
    try
    {
        // Merge view data
        viewData.Keys.ToList().ForEach(x => view.ViewData[x] = viewData[x]);

        // Render the view to a text writer
        var writer = new StringWriter();
        view.RenderView(writer);
        return writer.ToString();
    }
    finally
    {
        engine.ReleaseInstance(view);
    }
}

А вот мой тест:

[Test]
public void Can_Render_Order_Confirmation_Email_With_Spark_View_Engine()
{
    // Arrange
    var order = OrderInstanceFactory.CreateTestOrder();
    order.ContactEmail = "test@testicle.com";
    var emailService = new EmailService();
    var viewData = new ViewDataDictionary();
    viewData["Order"] = order;
    const string viewFolder = @"../../../../app/myProject.Web/Views";
    var viewFolderParameters = new Dictionary<string, string> {{"basePath", viewFolder}};

    // Act
    var emailBody = emailService.RenderEmailWithCustomViewFolder("Email/OrderConfirmation.spark", viewData, viewFolderParameters);

    // Assert
    Assert.IsNotNull(emailBody);
    Assert.IsTrue(emailBody.Contains("test@testicle.com"));
}

Мой шаблон OrderConfirmation.spark находится в моих веб-продуктах в Views / Email /.

0 голосов
/ 12 ноября 2011

Если это приложение ASP.NET MVC, то вы можете использовать VirtualPathProvider, так как оно подключается к HttpContext и остальной части времени выполнения. Вы бы использовали FileSystemProvider, если бы вы запускали его, например, из консольного приложения, или если вы хотите добавить папку из-за пределов вашего веб-приложения, возможно, потому что шаблоны были доступны другим приложениям, но я редко видел это сделано.

Надеюсь, это поможет ...

...