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$…它们都重定向到同一控制器,但操作不同)