求救:单元测试疑惑

最近MVC项目做单元测试,做的有点晕了。

网上看到这点:单元测试是最小的测试单元了,就是针对一个方法的

 

假设一个场景:类AB中有 A方法里调用了B方法,如下:

    public class AB
    {        public bool A(bool isSuccess)
        {
            B();            return isSuccess;
        }        public void B()
        {
        }
    }

 

现在 要针对方法A 进行单元测试。


        [TestMethod()]        public void ATest()
        {
            AB ab = new AB();            bool result = ab.A(true);
            Assert.AreEqual(true, result);
        }


疑问:

1.A方法调用了B方法,如果B方法发生异常,导致A方法的单元测试没有通过,

  这种情况下单元测试失败了,是否能说明A方法有问题?(我觉的A方法本身没有问题,是B方法的问题)

 

2.如果发生上面的情况,单元测试,其实并没有测试出是B方法的问题,实际项目中,一个方法里跟N多对象和方法有关,这样的单元测试是不是没有什么意义,它找不出具体的问题出在哪里,要单元测试何用?

 

3. 想到 电灯和 开关的例子,要测试电灯是否是好的,首先要保证开关是好的,如果开关都不能保证好的,灯没亮,就不知道是灯的问题还是开关的问题。

同理,如果B方法不能保证能正常通过,那么说单元测试A方法将没有用,或者说A方法是不可测试的,可不可以这样说?

 

4.Mock对象就是模拟对象,模拟环境,我对这个Mock对象的理解是去模拟那些可能会导致失败的外部环境。如A方法,依赖B方法,Mock对象应该去模拟B方法,如果模拟不了,就是说A方法可测试性差,或者不能测试。 不知道能不能这样理解? (如果真是这样的话,那就是好多方法都无法单元测试了)

 

望各位园友 指点一下,在这谢谢啦!


浮云间
浏览 395回答 2
2回答

呼如林

其实你已经差不多找到问题的原因了.对这就是A方法可测试性差,它绝对依赖于B方法的具体实现.而不是它的抽象.可测试性也是代码好坏的其中一个标准.很多不选择Web Form的原因也是它的可测试性差.当代码可测试性差时,你在单元测试里怎么搞也是没用的.所以这时应该是重构,使其有更好的可测试性.至于具体你上面的方法,不明白你为什么要在A里调用一个void的方法.所有也没有更好的重构建议.

达令说

如果单元测试不能解决这样的问题,那么单元测试的实用性就很差了吧……
打开App,查看更多内容
随时随地看视频慕课网APP