ASP.NET MVC - 单元测试矫枉过正? (TDD)(ASP.NET MVC - Uni

2019-08-03 13:21发布

于是我开始赶TDD错误,但我想知道如果我真的这样做是正确的......我好像在写测试了很多

在更多的测试越好,当然,但我有一种感觉,我在做这件事。 坦白地说,我不知道我能坚持多久了写这些简单的重复测试。

举例来说,这些都是从我的AccountController登录操作:

public ActionResult LogOn(string returnUrl)
{
    if (string.IsNullOrEmpty(returnUrl))
        returnUrl = "/";

    var viewModel = new LogOnForm()
    {
        ReturnUrl = returnUrl
    };

    return View("LogOn", viewModel);
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult LogOn(LogOnForm logOnForm)
{
    try
    {
        if (ModelState.IsValid)
        {
            AccountService.LogOnValidate(logOnForm);

            FormsAuth.SignIn(logOnForm.Email, logOnForm.RememberMe);

            return Redirect(logOnForm.ReturnUrl);
        }
    }
    catch (DomainServiceException ex)
    {
        ex.BindToModelState(ModelState);
    }
    catch
    {
        ModelState.AddModelError("*", "There was server error trying to log on, try again. If your problem persists, please contact us.");
    }

    return View("LogOn", logOnForm);
}

漂亮的自我解释。

然后,我有以下的测试套件

public void LogOn_Default_ReturnsLogOnView()
public void LogOn_Default_SetsViewDataModel()
public void LogOn_ReturnUrlPassedIn_ViewDataReturnUrlSet()
public void LogOn_ReturnUrlNotPassedIn_ViewDataReturnUrDefaults()
public void LogOnPost_InvalidBinding_ReturnsLogOnViewWithInvalidModelState()
public void LogOnPost_InvalidBinding_DoesntCallAccountServiceLogOnValidate()
public void LogOnPost_ValidBinding_CallsAccountServiceLogOnValidate()
public void LogOnPost_ValidBindingButAccountServiceThrows_ReturnsLogOnViewWithInvalidModelState()
public void LogOnPost_ValidBindingButAccountServiceThrows_DoesntCallFormsAuthServiceSignIn()
public void LogOnPost_ValidBindingAndValidModelButFormsAuthThrows_ReturnsLogOnViewWithInvalidModelState()
public void LogOnPost_ValidBindingAndValidModel_CallsFormsAuthServiceSignIn()
public void LogOnPost_ValidBindingAndValidModel_RedirectsToReturnUrl()

那是在杀人? 我还没有显示的服务的测试!

我哪些(如果有的话)可以剔除?

TIA,
查尔斯

Answer 1:

这一切都取决于你有多覆盖需要/想和多少可靠性是个问题。

下面是你应该问自己的问题:

  • 这是否单元测试帮助实现功能/代码更改,我还没有?
  • 请问这个单元测试帮助回归测试/调试这个单位,如果我做出改变以后呢?
  • 是为了满足这个代码单元测试不平凡的或值得为它写单元测试?

关于第三一个,我记得当我开始写单元测试(我知道,不是一回事TDD)我会测试,会是这样的:

string expected, actual;
TypeUnderTest target = new TypeUnderTest();
target.PropertyToTest = expected;
actual = target.PropertyToTest;
Assert.AreEqual<string>(expected, actual);

我可以做更多的东西高效地使用我的时间就像选择我的桌面更好的壁纸。

我推荐这篇文章ASP.net MVC书作者桑德森:

http://blog.codeville.net/2009/08/24/writing-great-unit-tests-best-and-worst-practises/



Answer 2:

我说你是做多一点,你可能不得不这样做。 虽然是好的,以测试你的代码可以采取一切可能的路径,一些路径只是不很重要或不导致行为的真正差异。

在你的榜样采取登录(字符串RETURNURL)

你在那里做的第一件事就是检查RETURNURL参数,如果它是空/空重新指定为默认值。 你真的需要一个整体单元测试只是为了确保一行代码偏偏如预期? 这是不太可能轻松突破一条线。

这可能打破这条线是东西,会抛出一个编译错误大多数的变化。 被分配在默认值的改变可能在该行(也许以后决定“/”是不是一个好的默认值...但在你的单元测试,我敢打赌,你硬编码它来检查“/ “你没有?所以在价值的变化将在必要测试的改变......这意味着你不是测试你的行为,而不是要测试你的数据。

你可以通过简单有一个测试不提供参数,实现对方法的行为测试。 这将创下日常的你的“设置默认”的一部分,同时还测试了代码的其余部分表现也很好。



Answer 3:

这看起来对我的权利。 是的,你会写很多单元测试和,最初,它似乎有点小题大做和TBH浪费时间; 但坚持下去,这将是值得的。 什么,你应该瞄准(而不仅仅是100%的代码覆盖率)为100%覆盖的功能。 但是...如果你发现你写了很多的UT对于同样的方法也可能是这种方法做太多。 尝试分离您的问题更多。 在我的经验,一个动作的身体应该做比newing,专班做真正的工作而已。 它是类,你应该与UT的目标定位。

克里斯



Answer 4:

100%的覆盖率是非常理想的,它的真正有用的,如果你有然而,大规模重构你的代码,测试将决定你的代码规范,以确保它是正确的。

我个人不是100%TDD(有时懒得过),但如果你打算做100%,也许你应该写一些测试助手带走这些重复测试的一些负担。 例如,写一个助手来测试标准的结构后所有的CRUD有一个回调,让你在一些评价传递可为您节约大量的时间。



Answer 5:

我是单元测试唯一的代码什么我不确定。 当然 - 你可以永远不知道什么会背刺你,但对于琐碎的事情写测试,好像对我来说是矫枉过正。

我不是一个单元测试/ TDD大师 - 但我认为这很好,如果你不写测试,只是为了让他们。 他们必须是有用的。 如果您正在使用单元测试足够的经历-你开始觉得他们什么时候是有价值的,当没有。

你可能会喜欢这本书 。

编辑:
其实 - 我只是发现了一个关于这个底下隔离框架章报价。 这是关于overspecifying测试(一个特定的测试),但我想这个想法仍然是更全局范围内:

Overspecifying测试
如果您的测试有太多的期望,您可以创建一个测试,甚至最轻的代码变更发生故障时,即使整体功能仍然有效。 考虑这个没有验证正确的事情的更多的技术途径。 测试相互作用是一把双刃剑:测试太多了,你就开始失去视力的大画面的整体功能; 测试太少了,你会错过对象之间的重要的相互作用。



文章来源: ASP.NET MVC - Unit testing overkill? (TDD)