3

我想为我的 asp.net Web 应用程序编写一些 Web 测试(通过 WatiN/Selenium + CassiniDev Web 服务器)。

我遇到的问题是在这种情况下我不知道该怎么办:有一个页面,用户可以点击按钮调用一些第三方服务。在我的网络测试中,我想创建这个服务的模拟,它总是返回静态值(这些测试用例中的一些值和其他测试用例中的其他值)。

我怎样才能做到这一点?

目前我使用 IoC/DI 容器 Microsoft Unity。我的页面以http://msdn.microsoft.com/en-us/library/ff664622%28v=pandp.50%29.aspx中描述的方式获取他的依赖项。

我想到的唯一解决方案是:将每个测试用例的所有依赖项放在 web.config 中,并在测试的 SetUp 上复制必要的 web.config。这个解决方案非常痛苦!

有任何想法吗?

4

2 回答 2

2

我在集成测试中也使用了 WatiN 和 Cassini-dev,并且不得不处理类似的问题。在我的设置装置中,我将我的 Asp.Net Web 应用程序部署到我的测试文件夹中的一个临时文件夹中,这允许我在启动 cassini-dev 之前使用配置。我将 Windsor 用于我的 CI,它允许我在配置级别更改注入的组件。您也可以使用Unity来实现这一点。

如果您所指的服务是 Web 服务,您只需使用您编写的接口模拟一个 Web 服务。

以下是我在运行集成测试时采取的步骤:

  1. 创建一个临时 Web 目录
  2. 将 Asp.Net Web 应用程序发布到临时目录(我使用 MSBuild 来执行此操作)
  3. 部署临时数据库(使用 MSbuild 和数据库项目,但可以通过多种方式完成)
  4. 部署临时会员数据库(请参阅我的博客文章,了解如何在代码中执行此操作)
  5. 更新已部署的 Asp.Net Web 应用程序的 web.config 以指向临时数据库并更改与测试相关的任何其他设置。
  6. 使用 Cassini-Dev 启动网站。我还使用 http 请求访问该站点,以便在运行任何测试之前验证该站点是否已启动。

运行测试。

运行测试后,您应该清理。

  1. 停止卡西尼开发
  2. 删除临时托管文件夹
  3. 删除临时数据库。我使用 Sql server SMO 对象,这些对象允许我查询 Sql Server,我使用它来删除在任何先前失败的测试运行后留下的任何旧数据库。

如何在代码中使用MSbuild部署网站

var properties = new Dictionary<string, string>
{
    {"Configuration", isDebug ? "Debug" : "Release"},
    {"WebProjectOutputDir", tempHostingDirectory.FullName},
    {"DeployToDatabase", "true"},
    {"OutDir", Path.Combine(tempHostingDirectory.FullName, "bin\\")}
};

using (var engine = new ProjectCollection(properties))
{
    engine
        .LoadProject(<web project path>, "4.0")
                .Build(new[] {"Build", "ResolveReferences", "_CopyWebApplication"});
}

Unity配置部分使用:http ://www.pnpguidance.net/Post/UnityContainerUnityConfigurationSectionAppConfigWebConfig.aspx

在代码中生成 asp.net 会员数据库:http: //bronumski.blogspot.com/2011/06/generating-creating-aspnet-application.html

MSDN 上的 Msbuild ProjectCollection:http: //msdn.microsoft.com/en-us/library/microsoft.build.evaluation.projectcollection.aspx

于 2011-08-01T10:19:41.110 回答
0

听起来您正在尝试模拟 Web 服务。Web 服务通常从 MarshalByRefObject 继承,这意味着您可以通过从 RealProxy 继承来创建一个 mock,以创建一个伪装成 webservice 的透明代理:

class Mock : RealProxy
{
    public Mock()
        : base(typeof(IStuff)) { }

    public IStuff GetStuff()
    {
        return (IStuff)GetTransparentProxy();
    }

    public override IMessage Invoke(IMessage msg)
    {
        IMethodCallMessage message = (IMethodCallMessage)msg;

        // the message object provides the MethodInfo that was called
        // as well as the arguments.

        // <Insert logic here>

        return new ReturnMessage(new NotImplementedException("comming soon to a test near you ..."), message);
    }
}

我相信 NMock2 使用 RealProxy 来模拟它,因此您应该能够使用它来模拟 Web 服务。

于 2011-01-31T09:14:07.460 回答