c# - 用于自动 UI 测试的模拟实现

标签 c# asp.net unit-testing

我正在努力将基本的自动 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/

相关文章:

c# - 通过将可变大小的字符串传递给它来从 C# 调用 C++ 函数

c# - Asp vnext IServiceCollection 存在于两个命名空间

unit-testing - 在描述的案例中寻找可测试的设计

c# - 为什么在ASP中的上下文中不存在The name…的编译错误?

unit-testing - Gulp Mocha 和 Browserify 的绝对路径

php - Gitlab CI 如何确定 PHPUnit 测试是通过还是失败?

c# - SortedList 中值的总和和键的条件

c# - 数据库的下拉列表,如何组合 DataTextField 的列?

asp.net - 禁用javascript中的复选框并将其识别为在服务器端选中

jquery - ASP.net 中隐藏在覆盖层后面的模态 jQuery 对话框