2012-11-01 63 views
-1

我正在寻找关于如何实现以下操作的模式。OO:保留另一个无状态对象内的对象的状态

我有一个名为的TestRunner一个对象,这是外部调用程序将调用并负责实例不同测试类和将执行他们的主类。

测试实例是无状态的,并应在每次运行后销毁。

里面的测试比如我想有,虽然实例化的数据访问类,用于缓存信息读取的的TestRunner实例的生命周期和应重新用于不同测试处决。

因此,这意味着我的数据访问类应该有像的TestRunner相同的寿命,但他们没有直接连接,通过临时测试类只间接。

什么是实现这一目标的好方法? 有人为数据访问类推荐了一个单例,但我不喜欢这样,因为它会保持比我需要的更长的状态(长于TestRunner life)。

也请注意,数据访问类是具体到每个测试类,所以它不是那么简单,只是把它的TestRunner

的成员变量,我要求严格OO这里,不使用特定的语言或框架。

谢谢! Bruno

回答

0

首先,如果测试实例是无状态的,那么没有必要重复使用它们。

它看起来像我应该将一些TestRunnerContext实例或TestRunner实例本身传递给每个Test实例。然后这些实例可以将他们的数据访问类实例添加到这个上下文中,以备后用。 TestRunnerContext实例将由TestRunner创建,并具有相同的生命周期。

+0

感谢您的回答......也许我错误地说它是无状态的。实际上它是有状态的,但数据在再次运行时必须消失(因此无论是清除还是重新创建整个对象,这对我来说都更好)。 –

1

我想你可能正在寻找命令模式。

这是你的一个测试签名:

public interface ITest 
{ 
    void Execute(); 
} 

然后你有你的TestRunner类,从另一个(测试)提供商,TestProvider得到它的测试:

public class TestRunner 
{ 
    private readonly TestProvider _testProvider; 

    public TestRunner(TestProvider testProvider) 
    { 
     _testProvider = testProvider; 
    } 

    public void RunAllTests() 
    { 
     foreach (ITest test in _testProvider.GetTests()) 
     { 
      test.Execute(); 
     } 
    } 
} 

一个简单的实现对于测试提供者(使用反射)可以是:

public class TestProvider 
{ 
    public IEnumerable<ITest> GetTests() 
    { 
     IEnumerable<Type> AllTypes = 
      AppDomain.CurrentDomain.GetAssemblies().ToList() 
       .SelectMany(s => s.GetTypes()) 
       .Where(p => typeof (ITest).IsAssignableFrom(p)); 
     foreach (Type typeToLoad in AllTypes) 
     { 
      if (!typeToLoad.IsInterface) 
       yield return (ITest) Activator.CreateInstance(typeToLoad); 
     } 
    } 
} 

...但既然你想在你的测试(如数据访问)的依赖关系,我会考虑改进这个以允许依赖注入......但现在这将做(如果没有测试提供程序的改进版本,Test2将无法正常工作 - 使用依赖注入)

所以,这里是一个简单的测试

public class Test1 : ITest 
{ 
    public void Execute() 
    { 
     Debug.WriteLine("I'm test 1"); 
    } 
} 

这里是依赖于其他依赖(所以你需要实现依赖注入之前,这将工作)更复杂的测试:

public class Test2 : ITest 
{ 
    private IDataSource ds; 

    public void Execute() 
    { 
     ds.Store("I'm test 2"); 
    } 
} 

这远不是p (我接受批评),但我希望这能给你一个好的起点。