我有一个表示WCF服务的类,它在我想要单元测试的类中用作成员变量。这将涉及编写一些场景,我遇到的问题是类的构造多次导致“除了一个单元测试之外的所有单元测试都存在”URI注册“错误。
任何单元测试都是孤立的,但是如果我在同一个测试运行中运行两个或多个测试,那么我就遇到了问题。
我的问题是如何在运行所有单元测试的标准测试运行中运行单元测试?
我的测试代码如下:
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var serviceModel = ServiceModelSectionGroup.GetSectionGroup(config);
var services = serviceModel.Services;
var address = services.Services[serviceName].Endpoints[0].Address;
var addressParts = address.AbsoluteUri.Split('/');
var newAddress = string.Join("/", addressParts.Take(addressParts.Length - 1));
newAddress = newAddress + "/" + Guid.NewGuid().ToString();
services.Services[0].Endpoints[0].Address = new System.Uri(newAddress);
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(serviceModel.Name);
var callRouter = new CallRouter();
var sut = new Callmanager(callRouter);
我的类有一个构造函数:
public CallManager(ICallRouter callRouter)
{
if (callRouter == null)
throw new ArgumentNullException(nameof(callRouter));
this.callRouter = callRouter;
this.callRouter.StartCallHandler += CallStarted;
this.callRouter.EndCallHandler += CallEnded;
hostCallManager = new System.ServiceModel.ServiceHost(callRouter);
hostCallManager.Open();
}
在我的app.config中我有:
<system.serviceModel>
<services>
<service name="CallRouter">
<endpoint address="net.tcp://localhost:8011/Service" binding="netTcpBinding" contract="ICallServiceRouter" />
</service>
</services>
所以我正在尝试的是动态地为每个单元测试生成一个新的端点(通过更改地址以包含guid),但这似乎不起作用,因为生成的每个CallRouter实例在使用相同的地址时我在同一个测试运行中运行所有单元测试(每次运行时地址都不同,因此修改工作正常),好像正在使用app.config的最后修改。
这是有意义的,因为它们都是从同一进程运行,并且并行运行,因此文件写入正在发生,并且由于运气不好,配置在加载之前被修改了很多次,但是当时它是,CallRouter的所有实例都为端点获取相同的值。
有没有办法让System.ServiceModel构造函数使用的配置在同一个会话中的每个单元测试都不同?
答案 0 :(得分:0)
您不必更改配置文件。相反,创建服务实例并在测试中以编程方式配置它们,如下所示:
hostCallManager = new ServiceHost(callRouter, new Uri("Unique URI for your test"));
hostCallManager.AddServiceEndpoint(typeof(ICallServiceRouter), new NetTcpBinding(), string.Empty);
hostCallManager.Open();