You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Visual Studio 2022中C#项目XUnit测试无法引用主命名空间求助

问题描述

在Visual Studio 2022中为C#代码编写XUnit测试时,已搭建好测试框架,但创建XUnit测试项目后,无法引用主代码中的AutoReleaseConfigSheet命名空间。已将Configuration类移至与Program同级,问题仍未解决。

目录结构

C:.
│   .gitlab-ci.yml
│   App.config
│   AutoReleaseConfigShee.csproj.user
│   AutoReleaseConfigSheet_v1.c.sln
│   cdav.cs
│   cdav.csproj
│   cdav.csproj.user
│   Configure.ini
│   debug.log
│   Oracle.DataAccess.Common.Configuration.Section.xsd
│   Oracle.ManagedDataAccess.Client.Configuration.Section.xsd
│   packages.config
│   readthis.txt
│
├───bin
├───GPUCache
├───obj
├───packages
└───Properties

主代码片段

using IniParser;
using IniParser.Model;
using Oracle.ManagedDataAccess.Client;
using System;
using System.Data;
using System.IO;
using System.Net.Mail;
using System.Data.SQLite;
using ClosedXML.Excel;
using Serilog;
using Serilog.Events;

namespace AutoReleaseConfigSheet
{
    class Program
    {
        static void Main()
        {
            ConfigureLogger();

            try
            {
                Log.Information("Application started");
                string configIniPath = Path.Combine(Directory.GetCurrentDirectory(), "Configure.ini");
                Configuration config = LoadConfiguration(configIniPath);

                InitializeFiles(config);

                ProcessInputFile(config);

                TriggerEmailNotification(config);

                SendReport(config.MailRecipients, config.MailServer, config.MailTitle);

                Log.Information("CDAV Executed successfully");
            }
            catch (Exception ex)
            {
                Log.Error(ex, "An error occurred");
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }

        static void ConfigureLogger()
        {
            string logDirectory = "log";
            string logFile = Path.Combine(logDirectory, ".log");

            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Information()
                .WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Information)
                .WriteTo.File(logFile, rollingInterval: RollingInterval.Day, restrictedToMinimumLevel: LogEventLevel.Information)
                .CreateLogger();
        }

        static Configuration LoadConfiguration(string configIniPath)
        {
            var parser = new FileIniDataParser();
            IniData data = parser.ReadFile(configIniPath);

            Configuration config = new Configuration
            {
                MiasConnStr = GetConfigData(data, "DBConnector", "MiasConnStr"),
                OrderFromOFSFileDirectory = GetConfigData(data, "MasterFiles", "OrderFromOFSFileDirectory"),
                MailTitle = GetConfigData(data, "EmailDistro", "Mail Title"),
                MailServer = GetConfigData(data, "EmailDistro", "Mail Server"),
                MailRecipients = GetConfigData(data, "EmailDistro", "Mail Recipients"),
                ReportRecipients = GetConfigData(data, "EmailDistro", "Report Recipients"),
                ReportTitle = GetConfigData(data, "EmailDistro", "Report Title")
            };

            return config;
        }

        public class Configuration
        {
            public string MiasConnStr { get; set; }
            public string OrderFromOFSFileDirectory { get; set; }
            public string AutoMailODMPath { get; set; }
            public string EmailBodyPath { get; set; }
            public string RlsOdrTxtPath { get; set; }
            public string HlOdrTxtPath { get; set; }
            public string MailTitle { get; set; }
            public string MailServer { get; set; }
            public string MailRecipients { get; set; }
            public string ReportRecipients { get; set; }
            public string ReportTitle { get; set; }
        }
    }
}

XUnit测试代码片段

using Xunit;
using AutoReleaseConfigSheet;

namespace AutoReleaseConfigSheet.Tests
{
    public class ProgramTests
    {
        [Fact]
        public void LoadConfiguration_ValidData_ReturnsConfiguration()
        {
            // Arrange
            string configIniPath = "path_to_test_config.ini"; // Update this with the actual test config file path
            Configuration expectedConfig = new Configuration
            {
                MiasConnStr = "TestConnStr",
                OrderFromOFSFileDirectory = "TestOrderDirectory",
                // ... initialize other properties with expected values
            };

            // Act
            Configuration actualConfig = Program.LoadConfiguration(configIniPath);

            // Assert
            Assert.Equal(expectedConfig.MiasConnStr, actualConfig.MiasConnStr);
            Assert.Equal(expectedConfig.OrderFromOFSFileDirectory, actualConfig.OrderFromOFSFileDirectory);
            // ... assert other properties
        }

        // Add more test methods for other parts of your code
    }
}
解决建议

1. 给测试项目添加主项目引用

右键XUnit测试项目 → 添加 → 项目引用,在弹出窗口中勾选主项目(cdav.csproj),点击确定。

2. 修正访问修饰符

  • Program类默认是internal,测试项目无法访问,需改为public:
    namespace AutoReleaseConfigSheet
    {
        public class Program
        {
            // 原有代码
        }
    }
    
  • LoadConfiguration方法默认是internal,需改为public static才能被测试项目调用:
    public static Configuration LoadConfiguration(string configIniPath)
    {
        // 原有代码
    }
    

3. 调整Configuration类位置(可选)

当前Configuration是Program的内部类,建议移到命名空间下成为顶级类,避免嵌套访问问题:

namespace AutoReleaseConfigSheet
{
    public class Program
    {
        // Program类代码
    }

    public class Configuration
    {
        // 原有属性
    }
}

4. 清理重建解决方案

点击Visual Studio顶部菜单 → 生成 → 清理解决方案,随后点击 生成 → 重建解决方案,确保所有项目编译正常。

5. 检查目标框架一致性

分别右键主项目和测试项目 → 属性,确认两者的目标框架版本一致(比如都是.NET 6.0),避免框架不兼容导致引用失败。

内容的提问来源于stack exchange,提问作者Michael Ng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 00:38:16