0

我有一堆WebPartBase类,我试图在其上调用一个方法。一些方法调用 UI 上的控件。我想以某种方式存根这些控件,以便在尝试对其设置值时不会引发异常。有谁知道这样做的好方法?如果它们被初始化也很好,但我不确定如何在不运行 Web 服务器的情况下初始化它们。

我的测试代码如下所示。IntializeOnAdd()是KPIWebPartBase上的一个方法,KPIWebPartBase继承WebPartBase

        [TestMethod]
        public void InvokeAllWidgets()
        {
            var user = new User("adminqaphi");
            user.CustomerID = TestConfig.ClientID;

            var classes = typeof(KPIWebPartBase)
                .Assembly
                .GetTypes()
                .Where(t => t.IsSubclassOf(typeof(KPIWebPartBase)) && !t.IsAbstract );
            foreach (var c in classes)
            {
                Console.WriteLine(c.Name);
                var instance = (KPIWebPartBase)Activator.CreateInstance(c);
                foreach (var billingMetric in Enum.GetValues(typeof(BillingMetric)))
                {
                    instance.CurrentUser = user;
                    instance.BillingMetric = (BillingMetric)billingMetric;

                    if (instance is StartEndKPIWebPartBase)
                    {
                        var startEndKPI = (StartEndKPIWebPartBase)instance;
                        startEndKPI.StartDate = new DateTime(2007, 1, 1);
                        startEndKPI.EndDate = new DateTime(2008, 1, 1);
                    }

                    instance.InitializeOnAdd();
                }
            }
        }
4

1 回答 1

0

我会为它们创建接口(如果可能的话)并使用moq为外部依赖项创建 Mocks 或存根。

InvokeAllWidgets() 测试什么行为?

对评论的回应:我认为您也应该模拟数据库,以便您只测试代码(单元)的“内部”逻辑。否则,您将最终测试数据库,我想这不是您想要的。如果您确实调用了数据库,如果其中的某些数据发生变化会发生什么?这会让你的测试失败吗?如果是这样,我认为您正在进行集成测试而不是单元测试。在单元测试中尝试模拟所有外部依赖项并测试您自己的逻辑(会出现什么问题?)。如果您的代码不允许您像这样测试它,请更改它!

于 2013-02-13T14:15:01.210 回答