如何在MonoRail中单元测试视图的输出?

时间:2010-11-27 03:11:36

标签: unit-testing castle-monorail

我一直在尝试为MonoRail编写一些初始的NUnit单元测试,已经有了一些基础知识。但是,虽然我已经设法检查控制器操作是否设置了Flash [“message”]值,但是BaseControllerTest类似乎根本不存储视图的输出,所以无论我是否调用RenderView或者动作本身,没有任何内容被添加到Response.OutputContent数据中。 我也试过调用InPlaceRenderView来尝试让它写入StringWriter,而StringWriter似乎也没有得到任何回报 - 返回的StringBuilder也是空的。 我正在创建一个新的控制器实例,然后调用 PrepareController(控制器 “”, “家”, “索引”);

到目前为止,看起来BaseControllerTest似乎导致任何输出被放弃。我错过了什么吗?这有用吗?我不是百分百肯定,因为虽然我也在Linux上运行MonoDevelop中的这些单元测试,尽管MonoRails在那里工作正常。

1 个答案:

答案 0 :(得分:0)

虽然我没有理想的方法来测试视图,但是当ViewComponents可以被充分测试时,这可能不太重要。要在站点内测试视图,我可以使用Selenium。理论上它可以成为NUnit测试套件的一部分,但是在我的测试中没有在MonoDevelop下成功运行(尽管RC交互式会话工作正常,但未能始终如一地启动与Selenium RC的连接)。但是,Selenium测试可以作为一个集合从Firefox运行,这不是太糟糕 - 使用NUnit进行单元测试,然后使用Selenium套件进行集成/系统测试脚本编写,并且该设置将在Linux / MonoDevelop设置中运行。

至于测试底层元素,你可以检查重定向并检查flash值集等等,这样就可以了。对于测试ViewComponents,部分模拟渲染确实以可访问的形式返回渲染输出,所以事实证明,它们更容易在NUnit中测试(使用BaseViewComponentTest的基本测试类),如下所示:

[Test]
public void TestMenuComponentRendersOK()
{
   var mc = new MenuComponent();
   PrepareViewComponent(mc);
   var dict = new System.Collections.Specialized.ListDictionary();
   dict.Add("data",getSampleMenuData());
   dict.Add("Name","testmenu");
   // other additional parameters
   mc.RenderComponent(mc,dict);
   Assert.IsTrue(this.Output.Contains("
  • "),"List items should have been added"); }