【问题标题】:Assembly context being changed in MStest- Possible to avoid?MStest 中更改的程序集上下文 - 可以避免吗?
【发布时间】:2009-09-18 21:38:11
【问题描述】:
我正在尝试在我们的代码库中使用 MSTest。现在我在此期间遇到了不同的问题。
我们隐式使用来自Microsoft.Practices.EnterpriseLibrary.Data 的_getDefaultName,它在当前程序集的 App.config 中获取默认连接字符串。由于此测试项目将是一个新的程序集/项目,因此无法在源项目中找到连接字符串。
我可以通过硬编码连接字符串或在源代码中明确给出 App.config 的路径来避免这种情况。
但我不想为了测试代码而更改源代码,那么有没有办法指定或更改当前正在运行的程序集?
如果我使用任何其他测试框架,我的生活会变得简单吗?
【问题讨论】:
标签:
c#
visual-studio
assemblies
mstest
【解决方案1】:
好吧,如果您使用其他测试框架,您的生活可能会更简单;)(我使用并喜欢NUnit)但这不太可能解决这个问题。
我建议将 App.config 数据复制到单元测试程序集中。您可能想要更改它,因为您可能不希望您的测试针对生产数据库运行。
如果您想进行单元测试(与集成测试相反),请考虑编写根本不访问数据库的测试。这通常是通过使用分层架构、依赖注入和隔离(模拟对象)框架来实现的。关于 SO 的这些单独主题有很多;如果您有兴趣但找不到资源,请发表评论。
【解决方案2】:
您可以考虑采用outlined in another post 的方法。我采用了该链接中的一个示例,并将其更改为看起来像您的情况:
public static class Context
{
private static string ConnectString;
public static string Connect
{
get { return ConnectString ?? DataFactory.instance; }
set { ConnectString= value; }
}
private class DataFactory
{
static DataFactory() { }
internal static readonly string instance
= EntLib.Data._getDefaultName;
}
}
现在,当生产代码运行时,它会从 EntLib(从 App.Config 文件)获取其配置。但是,当您运行 mstest 代码时,请确保在测试程序集的任何部分之前将所需的连接字符串注入 Context.Connect。