我在Visual Studio 2008解决方案中有这种设置:一个WCF服务项目(WCFService)使用库(Lib1,它需要app.config文件中的一些配置条目)。我有一个单元测试项目(MSTest),其中包含与Lib1相关的测试。为了运行这些测试,我需要在测试项目中使用配置文件。有没有办法从WCFService自动加载它,所以我不需要在两个地方更改配置条目?
答案 0 :(得分:2)
让您的库直接从app.config文件中读取属性,这将使您的代码变得脆弱且难以测试。最好让一个类负责读取配置并以强类型方式存储配置值。让此类实现一个接口,该接口定义配置中的属性或使属性成为虚拟属性。然后你可以模拟这个类(使用类似RhinoMocks的框架或手工制作一个也实现接口的假类)。将类的实例注入到需要通过构造函数访问配置值的每个类中。设置它,以便如果注入的值为null,则它会创建正确类的实例。
public interface IMyConfig
{
string MyProperty { get; }
int MyIntProperty { get; }
}
public class MyConfig : IMyConfig
{
public string MyProperty
{
get { ...lazy load from the actual config... }
}
public int MyIntProperty
{
get { ... }
}
}
public class MyLibClass
{
private IMyConfig config;
public MyLibClass() : this(null) {}
public MyLibClass( IMyConfig config )
{
this.config = config ?? new MyConfig();
}
public void MyMethod()
{
string property = this.config.MyProperty;
...
}
}
测试
public void TestMethod()
{
IMyConfig config = MockRepository.GenerateMock<IMyConfig>();
config.Expect( c => c.MyProperty ).Return( "stringValue" );
var cls = new MyLib( config );
cls.MyMethod();
config.VerifyAllExpectations();
}