2013-11-04 210 views
2

做TDD并希望隔离被测方法:Direct(); 然而,当测试创建MyClass,SomeClass.SetupStuff();炸掉(NotImplementedException)。因此,将IMyClass接口修改为具有Configure();方法,可以在MyClass构造之后调用该方法以避免该异常。c#构造函数与初始化

问题:这是处理这种情况的一种可接受的方式,或者是否存在一些基本的OOP主体?

public class MyClass : IMyClass 
{ 
    public MyClass() 
    { 
    // class with static method that sets stuff up 
    SomeClass.SetupStuff(); 
    } 
    public void IMyClass.Direct() 
    { 
    // want to test this 
    } 
} 

VS

避免此类问题
public class MyClass : IMyClass 
{ 
    public MyClass() 
    { 

    } 
    public void IMyClass.Direct() 
    { 
    // want to test this 
    } 
    // 
    public void IMyClass.Configure() 
    { 
    // class with static method that sets stuff up 
    SomeClass.SetupStuff(); 
    } 
} 
+0

在实例方法中设置静态数据对我来说似乎很奇怪。 – Tilak

+0

这有点令人困惑。如果你正在做TDD,那么这意味着你的测试*应该失败*直到你实现需要实现的东西。如果你还没有实现'SomeClass.SetupStuff',那么你需要实现它才能通过测试。我想我只是不明白这里的问题。将代码移回'.ctor'并实现该方法。繁荣,测试通过。 –

+0

为什么不通过构造函数注入SomeClass。不要让它变成静态的。而不仅仅是为了你的测试而嘲笑它。你的课目前依赖于SomeClass。你想测试Direct()而不是SomeClass – Sean

回答

5

一种方法是使用依赖注入

public class MyClass : IMyClass 
{ 
    public MyClass(ISomeClass someClass) 
    { 
     someClass.SetupStuff(); 
    } 

    public void IMyClass.Direct() 
    { 
     // want to test this 
    } 
} 

通过从SomeClass的脱钩类,你可以自由地提供一个模拟实现ISomeClass的在测试期间可以在运行时提供完整的实现。