C# .Mvc规范中的URL更改
假设您这样配置您的C# .Mvc规范中的URL更改,c#,asp.net-mvc-5,integration-testing,C#,Asp.net Mvc 5,Integration Testing,假设您这样配置您的规格PrintegrationHost config.UseApplicationAtUrl("http://mylocaldomain.com"); 您的一些页面位于子域上,因为您在RouteConfig中以这种方式配置了它。您无法测试这些,因为您需要更改主机 public class When_Viewing_Global_Page : SpecsFor<MvcWebApp> { protected override void When() {
规格PrintegrationHost
config.UseApplicationAtUrl("http://mylocaldomain.com");
您的一些页面位于子域上,因为您在RouteConfig中以这种方式配置了它。您无法测试这些,因为您需要更改主机
public class When_Viewing_Global_Page : SpecsFor<MvcWebApp>
{
protected override void When()
{
//The HomeController.Global is triggered only
//in the URL http://global.mylocaldomain.com
//this results in 404
SUT.NavigateTo<HomeController>(c => c.Global());
}
[Test]
public void Then_It_Shows_The_Project_Name()
{
string text = SUT.AllText();
SUT.AllText().ShouldContain("This is the Global Page");
//This will fail because the page contains "Not Found"
}
}
查看全局页面时的公共类:规格
{
受保护的覆盖在()时无效
{
//HomeController.Global仅被触发
//在URL中http://global.mylocaldomain.com
//结果是404
SUT.NavigateTo(c=>c.Global());
}
[测试]
public void然后显示项目名称()
{
string text=SUT.AllText();
SUT.AllText().ShouldContain(“这是全局页面”);
//此操作将失败,因为页面包含“未找到”
}
}
有没有一种方法可以告诉SpecsFor.Mvc中的测试更改基本URL?发现有一个公共静态属性保存基本URL名称。您可以简单地更改它,但如果您的测试未排序,则必须将其更改回来
public class When_Viewing_Global_Page : SpecsFor<MvcWebApp>
{
protected override void When()
{
//change to base url to the subdomain
MvcWebApp.BaseUrl = "http://global.mylocaldomain.com";
SUT.NavigateTo<HomeController>(c => c.Global());
}
[Test]
public void Then_It_Shows_The_Project_Name()
{
string text = SUT.AllText();
SUT.AllText().ShouldContain("This is the Global Page");
//Success
}
[TestFixtureTearDown]
public void Cleanup()
{
//you have to change that back to the URL that was
//set up in your SpecsForIntegrationHost
MvcWebApp.BaseUrl = "http://mylocaldomain.com";
}
}
查看全局页面时的公共类:规格
{
受保护的覆盖在()时无效
{
//更改为子域的基本url
MvcWebApp.BaseUrl=”http://global.mylocaldomain.com";
SUT.NavigateTo(c=>c.Global());
}
[测试]
public void然后显示项目名称()
{
string text=SUT.AllText();
SUT.AllText().ShouldContain(“这是全局页面”);
//成功
}
[测试固定器拆卸]
公共空间清理()
{
//您必须将其更改回原来的URL
//在您的规格中设置PrintegrationHost
MvcWebApp.BaseUrl=”http://mylocaldomain.com";
}
}
这应该很容易在父类中抽象出来。这是一个很好的解决方案。不过,我有兴趣尝试找到一种方法,按照惯例为这个场景添加支持。以子域为目标的控制器是否以某种方式区分?它们是在一个单独的名称空间中还是类似的地方?首先,让我告诉你SpecsFor.Mvc非常棒:)第二:不,不是在控制器中。。。URL在applicationhost.config绑定和RouteConfig中硬编码,具有可通过正则表达式检测主机的约束(第一个路由约束为^mydomain\.com$…第二个路由约束为^global\.mydomain\.com$…它们都重定向到同一控制器,但操作不同)