用于自动UI测试的模拟实现
问题描述:
我正在为每个每晚构建的单元测试块添加基本的自动UI测试。我们使用了MSTest编码的UI并创建了一个脚本。用于自动UI测试的模拟实现
代码隐藏取决于IClientManager,实际管理者和模拟实现。 我的问题是,我不知道如何在运行测试时在按钮点击处理程序内部的真实和模拟实现之间自动切换。
我的另外两个约束是,我不能在代码隐藏方面依赖于模拟程序集,并且我不能使用DI框架,因为客户端是“安全意识”并获得框架批准可能需要几个月。
有没有办法做到这一点手动,并希望,不是一个更大的问题,而不是我想要解决的问题?
谢谢!
答
你可以建立自己的简单对象容器,如果你不能使用第三方一个(这是愚蠢的,但我明白,我以前去过那里)
这里的东西,我掀起了可能让你开始......没有测试它,它真的是粗糙,但希望你的想法
public static class ObjectFactory
{
static IDictionary<Type, object> _factory = new Dictionary<Type, object>();
public static void Register<T>(Func<T> builder)
{
if (_factory.ContainsKey(typeof(T)))
_factory[typeof(T)] = builder;
else
_factory.Add(typeof(T), builder);
}
public static T GetInstance<T>()
{
if (_factory.ContainsKey(typeof(T)))
throw new ArgumentException(string.Format("Type <{0}> not registered in ObjectFactory", typeof(T).Name));
return ((Func<T>)_factory[typeof(T)])();
}
}
public interface IClientManager { }
public class RealClientManager : IClientManager { }
public class MockClientManager : IClientManager { }
public class MyView
{
public MyView()
{
// probably better to do this registry in some sort of application initialization
ObjectFactory.Register<IClientManager>(() => new RealClientManager());
}
public void SomeMethodThatNeedsClientManager()
{
var clientManager = ObjectFactory.GetInstance<IClientManager>();
}
}
public class MyTester
{
[TestMethod()]
public void SomeTest()
{
var view = new MyView();
// swap the client manager in the test
ObjectFactory.Register<IClientManager>(() => new MockClientManager());
// Asserts
}
}
你可以看到,如果你已经使用StructureMap或其他一些DI容器之前他们做了很多同样的事情还有很多额外的细节,比如遍历对象图并根据约定自动注册对象,管理对象lif ecycles,容器范围等等......很多这些东西你也可以实现......但是你应该真的使用了一个经过验证的真正解决方案,比如StructureMap