Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TDD和保护方法_C#_Asp.net Mvc_Tdd - Fatal编程技术网

C# TDD和保护方法

C# TDD和保护方法,c#,asp.net-mvc,tdd,C#,Asp.net Mvc,Tdd,我试图通过创建现有MVC应用程序的副本来学习TDD,但我正在使用TDD从头开始创建它的副本 在我现有的应用程序中,我有一个应用程序\u AuthenticateRequest方法,如下所示 这是受保护的。我认为这些方法不应该被测试,对吗?也就是说,你应该只测试公共方法,而不是私有和受保护的方法。如果这是真的,那么我会在下面编写受保护的方法,而不为其编写任何测试吗 public class MvcApplication : System.Web.HttpApplication { prot

我试图通过创建现有MVC应用程序的副本来学习TDD,但我正在使用TDD从头开始创建它的副本

在我现有的应用程序中,我有一个应用程序\u AuthenticateRequest方法,如下所示

这是受保护的。我认为这些方法不应该被测试,对吗?也就是说,你应该只测试公共方法,而不是私有和受保护的方法。如果这是真的,那么我会在下面编写受保护的方法,而不为其编写任何测试吗

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        StaticDataSeeder.Seed();
    }

    protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];

        if (authCookie == null) return;

        var authTicket = FormsAuthentication.Decrypt(authCookie.Value);

        if (authTicket == null) return;

        var userData = new UserDataModel(authTicket.UserData);

        var userPrincipal = new PaxiumPrincipal(new GenericIdentity(authTicket.Name), null)
        {
            Email = userData.Email,
            Menu = userData.Menu,
            RememberMe = userData.RememberMe
        };

        Context.User = userPrincipal;
    }
}

仅仅进行测试并不意味着它是TDD。若你们已经假设私有方法做了一些事情,那个么开发并不是由测试驱动的,是吗


试着先盲目地编写测试,最终可能根本不需要私有方法,甚至在另一个类中将其作为公共方法使用。

是的,您的测试用例是正确的,您只能测试您可以调用的方法。因此,公共方法通常是可测试的。同样,如果组件中有一个私有方法,这意味着必须由该组件中至少一个公共方法调用它。因此,在测试公共方法的同时,也在同一测试中测试私有方法的功能。私有方法,您可以考虑公共方法的几行,避免公开方法使代码更可读和重用性。

受保护的方法在您创建的类和它的未来的孩子之间创建一个契约。如果您不想创建这个契约,那么应该将这些方法定义为私有的,而不是受保护的。因此,我认为您应该测试这些方法的行为是否符合任何派生类的期望

考虑两类问题:

public abstract class BaseMathsClass {
    protected int Mult(int a, int b) {
        return a * b;
    }
}

public class ConcreteMathClass : BaseMathsClass {
    public int Square(int x) {
        return Mult(x, x);
    }
}
如果您乐于在
ConcreteMathClass
的测试中测试
Mult
方法的功能,那么您不需要为基类编写测试。但是,如果您确实为基类编写测试,这将在编写基类时巩固契约,这意味着任何派生类都知道它们要注册什么。你站在哪一边取决于你的意见。他有一些其他的观点

您还说您相信不需要测试私有方法。这是正确的,因为您不需要编写特定的测试来直接调用私有方法,但是您应该通过针对类的公共方法的测试隐式地测试任何私有方法的功能。编写测试时,您不应该真正关心您的类是否具有以下任一实现:

实施1

class MyClass {
    public int GetSquare(int someValue) {
        return someValue * someValue;
    }
}
实施2

class MyClass {
    public int GetSquare(int someValue) {
        return Mult(someValue, someValue);
    }

    private int Mult(int a, int b) {
        return a * b;
    }
}
对于实现2,您不需要编写专门调用
Mult
的测试,
GetSquare
的测试充分地执行了这段代码。这并不意味着您只需编写另一个私有方法
Add
,因为目前您的公共界面上不需要它


您可能还对的答案感兴趣。

我认为您需要阅读此内容。这可能对您有帮助。鉴于以前有人问过此问题,我可以很容易地搜索此问题,因为我确信此问题在本网站和其他网站上已被问过多次。虽然我喜欢与人交谈,但有时我不想仅仅通过谷歌搜索一些东西——我想要人与人之间的互动。我想如果你根据你的具体情况定制了你的问题,也就是说,当您创建一个适合现有生态系统并需要特定扩展点的类时,您想知道您/您应该如何使用TDD,这样问题就不太可能以重复的形式结束,您就可以得到更多相关的答案作为起点(例如,目前投票率最高的答案似乎并没有特别针对你心目中的问题).是的,我想你是对的,我的错。我的代码实际上是挂接到MVC应用程序的管道中的-我调用的不是一些简单的api。它需要在哪里,因此我不确定如何处理它。但我没有调用公共方法-它们在MVC应用程序的管道中。如果你想遵循TDD,你应该编写测试用例以单独测试组件的公共方法(模拟必要的依赖项),无论它在您的框架中如何使用以及在何处使用。在这种情况下,我不会调用或编写公共方法-所有这些都在MVC应用程序的管道中。@DaveAmour该行为仍然需要测试,或者不应该在那里。根据该方法的作用,您可能会决定是否在适当的地方测试它(在本例中,通过集成测试)比单独的单元测试更容易/更合适,这一决定与我在上面所指出的一样,在这里你需要决定是否用受保护的方法来测试类,或者你很乐意把它们看作是更大的单元的一部分,并通过使用它们的类隐式地测试它们。我一直在努力解决主观决策的灰色地带。我真的可以与一些经验丰富的开发人员一起完成一些真正的TDD工作,但我必须在mo.DaveAmour的家中独自完成所有工作。@DaveAmour即使在优秀的团队中,狂热者和实用主义者之间仍然非常主观。就我个人而言,我认为最好的开始方法是让我们先尝试进行100%测试一段时间,研究一些if技术,使您的代码更易于单元测试,然后找出单元的组成部分,以及何时集成测试是更好的方法,这样,如果您找到进行TDD的地方,您就可以进行讨论了。我并没有真正使用它,但可能值得一看是一个合适的聊天室,可以从别人那里得到一些反馈。谢谢-很好的建议。我也有一个关于在应用程序中提取代码的想法