2011-11-11 110 views
2

我使用基於安德魯Kharlamov的this example的Spark View Engine從ASP.NET MVC應用程序發送電子郵件。在ASP.NET MVC單元測試項目中爲Spark添加ViewFolder

我已經設置了一個單元測試CanSendEmail,但我需要在配置中指定viewfolder。 我發現文檔here和例子給出這樣的:

<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> 

我的問題是這樣的。我使用哪種folderType,並且是否需要其他參數。我的測試產品是調用myProject.Tests,並且包含視圖的我的Web項目名爲myProject.Web,其中包含一個Views文件夾。

我是否使用FileSystem,VirtualPathProvider ...?

編輯[14/11/2011]:

好吧,我已經在myProject.Tests得到這個在我的app.config:

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

我仍然得到「查看源文件未找到。 「當我運行我的測試。我希望測試使用myproject.Web中的視圖。

回答

1

我的基於博客文章herehere,並與@RobertTheGrey幫助和尋找星火源代碼的測試解決方案

,我結束了使用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 = "[email protected]"; 
    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("[email protected]")); 
} 

我OrderConfirmation.spark模板住在我的web產品的意見/電子郵件/。

0

如果它是一個ASP.NET MVC應用程序,那麼您可以使用VirtualPathProvider,因爲它掛鉤到HttpContext和其他運行時。例如,如果您是從控制檯應用程序運行它,或者如果您想要從Web應用程序外部添加文件夾,則可能會使用FileSystemProvider,這可能是因爲該模板是由其他應用程序共享的,但我很少看到這樣做。

希望幫助...

+0

乾杯。我是否需要在配置文件中指定Web項目的程序集,或者如何告訴我的測試項目中的spark會在我的標準視圖文件夾中查找 – autonomatt

+0

我編輯了我的問題,以使用VirtualPathProvider包含當前的Spark配置節。我仍然無法測試工作。 – autonomatt

+0

測試不會使用web.config。但是,您可以通過將ViewFolder添加到引擎實例來在測試設置中使用代碼添加視圖文件夾 – RobertTheGrey

相關問題