在C#单元测试中测试应用程序设置检索

在C#单元测试中测试应用程序设置检索,c#,unit-testing,C#,Unit Testing,我是单元测试的新手。我有一个MVC5项目及其相关单元测试项目的解决方案。我在该解决方案中还有4个其他类库,并添加了一个单元测试项目来封装这些其他类库的所有测试 问题#1。以上是正确的方法还是每个库都需要自己的单元测试 我创建了一个单元测试,以测试单元测试是否有效 public class TestAppSettingsRetrieval { [TestMethod] public void TestMethod1() { var emailProvide

我是单元测试的新手。我有一个MVC5项目及其相关单元测试项目的解决方案。我在该解决方案中还有4个其他类库,并添加了一个单元测试项目来封装这些其他类库的所有测试

问题#1。以上是正确的方法还是每个库都需要自己的单元测试

我创建了一个单元测试,以测试单元测试是否有效

public class TestAppSettingsRetrieval
{
    [TestMethod]
    public void TestMethod1()
    {

        var emailProvider = Services.Helpers.ServicesAppSettings.EmailSettings.EmailProvider;
        Assert.AreEqual(emailProvider, "gmail.com");
    }
}
这将从“我的服务”项目的app.config文件中提取(或应该提取)EmailProvider应用程序设置

以下是appsettings配置和ServicesAppSettings类

 public static class ServicesAppSettings
{
    public static class SmsSettings
    {
        public static string SmsProvider => ConfigurationManager.AppSettings["SmsProvider"];
        public static string SmsAccountIdentifier => ConfigurationManager.AppSettings["SmsAccountIdentifier"];
        public static string SmsPassword => ConfigurationManager.AppSettings["SmsAccountPassword"];
        public static string SmsFromPhone => ConfigurationManager.AppSettings["SmsFromPhone"];
    }

    public static class EmailSettings
    {
        public static string EmailProvider => ConfigurationManager.AppSettings["EmailProvider"];
        public static string EmailProviderHost => ConfigurationManager.AppSettings["EmailProviderHost"];
        public static string EmailAccount => ConfigurationManager.AppSettings["EmailAccount"];
        public static string EmailAccountPassword => ConfigurationManager.AppSettings["EmailAccountPassword"];
    }
}


<appSettings>
    <!--email settings-->
    <add key="EmailProvider" value="gmail.com" />
    <add key="EmailProviderHost" value="smtp.gmail.com" />
    <add key="EmailAccount" value="**" />
    <add key="EmailAccountPassword" value="**" />
</appSettings>
公共静态类服务设置
{
公共静态类SmsSettings
{
公共静态字符串SmsProvider=>ConfigurationManager.AppSettings[“SmsProvider”];
公共静态字符串SmsAccountIdentifier=>ConfigurationManager.AppSettings[“SmsAccountIdentifier”];
公共静态字符串SmsPassword=>ConfigurationManager.AppSettings[“SmsAccountPassword”];
公共静态字符串SmsFromPhone=>ConfigurationManager.AppSettings[“SmsFromPhone”];
}
公共静态类设置
{
公共静态字符串EmailProvider=>ConfigurationManager.AppSettings[“EmailProvider”];
公共静态字符串EmailProviderHost=>ConfigurationManager.AppSettings[“EmailProviderHost”];
公共静态字符串EmailAccount=>ConfigurationManager.AppSettings[“EmailAccount”];
公共静态字符串EmailAccountPassword=>ConfigurationManager.AppSettings[“EmailAccountPassword”];
}
}
测试总是失败,因为返回的值为null。
问题#2我能否在单元测试中从另一个项目的app.config中检索?

我认为app.config文件的路径取决于哪个项目是入口点-当您运行测试项目时,这当然与运行实际应用程序时不同。尝试将app.config文件从您的服务项目复制到测试项目,看看是否有效。如果是这样,您可能需要添加预构建操作,以确保您始终拥有最新的版本。是的,将应用程序配置放入测试项目中是可行的,但这无法实现从一个单元测试项目测试到其他4个单元测试项目的目的。我认为您尝试测试的是-“该方法可以从
.config
文件中正确读取
EmailProvider
的值因此,您应该测试功能而不是值。现在,如果该方法能够从单元测试的配置文件中正确读取值,那就足够了。@Arghya C您是对的。而且它确实可以与测试项目问题1中的app.config一起正常工作。没有“正确”的方法,请使用最适合您的项目/解决方案的方法。至于其余部分,正如前面的评论所提到的,应用程序设置来自位于执行入口点的配置文件。因此,基本上,将这些设置放入测试项目的配置文件对我来说是正确的。