我正在努力将基本的自动 UI 测试添加到我们在每个夜间构建中运行的单元测试 block 中。我们使用 MSTest 编码的 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 容器,那么它们会做很多相同的事情,并添加很多细节,例如遍历对象图并根据约定自动注册对象、管理对象生命周期、容器范围等...很多这些东西您也可以自己实现...但您应该真正使用经过验证的真实解决方案,例如 StructureMap
关于c# - 用于自动 UI 测试的模拟实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8230971/