我想为我的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。这个解决方案非常痛苦!
有什么想法吗?
答案 0 :(得分:2)
我在集成测试中也使用WatiN和Cassini-dev,并且不得不处理类似的问题。在我的设置夹具中,我将我的Asp.Net Web应用程序部署到我的测试文件夹中的临时文件夹,这允许我在启动cassini-dev之前使用配置。我使用Windsor作为我的CI,它允许我在配置级别更改注入的组件。您也可以使用Unity来实现此目的。
如果您所指的服务是Web服务,您只需使用您编码的界面模拟Web服务。
以下是我在运行集成测试时采取的步骤:
运行测试。
运行测试后,您应该清理。
如何在代码中使用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
答案 1 :(得分:0)
听起来您正在尝试模拟Web服务。 Web服务通常继承自MarshalByRefObject,这意味着您可以通过继承RealProxy来创建一个假装成为Web服务的透明代理来创建模拟:
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服务。