首页 > 解决方案 > 在 .Net xUnit 项目中,当我运行测试时,我收到“程序不包含静态‘主’”错误,因为我引用了其他项目将被测试

问题描述

我正在做一个项目,此时出现错误。如果我在名为 ECommercial.Core 的 xunit 测试项目中添加对其他项目的引用,则会收到入口点错误。没有循环引用之类的。在其他问题上,人们会误认为主方法不止一个,但对我来说,错误是有任何主方法。如果我从测试项目中删除参考,就会有任何问题。测试方法是空的,没有什么会导致方法内部的错误。这是错误消息。

错误信息

----- 在“ECommercial.DataAccess.Tests.UnitTest1”类中运行测试 ----- 对于 .NET Microsoft (R) Build Engine 版本 16.7.0+7fb82e5b2

CSC:错误 CS5001:程序不包含适合 > > 用于入口点的静态“主要”方法 [c:\Users\nihaSWin\Desktop\ECommercial\ECommercial.Core\ECommercial.Core.csproj]

构建失败

CSC:错误 CS5001:程序不包含适用于入口点的静态“主要”方法 [c:\Users\nihaSWin\Desktop\ECommercial\ECommercial.Core\ECommercial.Core.csproj] 0 警告 1 错误

运行时间 00:00:00.68

我怎样才能解决这个问题 ?我必须添加其他项目来测试它们。

我试过但没有用

  1. 我尝试添加与 Core 项目相同的依赖项
  2. 升级 sdk 版本到 4.5.2
  3. 将 <GenerateProgramFilefalse> false </GenerateProgramFile> 属性添加到属性组
  4. 重新生成整个项目

测试项目文件夹名称为 ECommercial.DataAccess.Tests,里面只有 UnitTest1.cs 项目。文件代码

using Xunit;
namespace ECommercial.DataAccess.Tests
{
public class UnitTest1
{

    [Fact]
    public void Get_Product_From_Table()
    {

    }
    [Fact]
    public void Get_Product_List_From_Table()
    {

    }
}
}

在引用的 Ecommercial.Core 文件夹中,只有 IEntity 空接口和 NHibernate 实体存储库文件。这是文件代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using ECommercial.Core.DataAccess.NHibernate.Helpers;
using ECommercial.Core.Entities;

namespace ECommercial.Core.DataAccess.NHibernate
{
    public class NHibernateIEntityRepository<TEntity>:IEntityRepository<TEntity> 
        where TEntity:class,IEntity,new()
    {
        private NHibernateHelper _nHibernateHelper;

        public NHibernateIEntityRepository(NHibernateHelper nHibernateHelper)
        {
            _nHibernateHelper = nHibernateHelper;
        }

        public TEntity Add(TEntity entity)
        {
            using (var session=_nHibernateHelper.openSession()){
                session.Save(entity);
                return entity;
            }
        }

        public void Delete(TEntity entity)
        {
            using (var session=_nHibernateHelper.openSession()){
                session.Delete(entity);
            }
        }

        public TEntity Get(Expression<Func<TEntity, bool>> filter)
        {
            using (var session=_nHibernateHelper.openSession()){
                TEntity result = session.Query<TEntity>().SingleOrDefault(filter);
                return result;
            }
        }

        public List<TEntity> GetList(Expression<Func<TEntity, bool>> filter = null)
        {
            using (var session=_nHibernateHelper.openSession()){
                if(filter==null)
                    return session.Query<TEntity>().ToList();
                List<TEntity> result = session.Query<TEntity>().Where(filter).ToList();
                return result;
            }
        }

        public TEntity Update(TEntity entity)
        {
            using (var session=_nHibernateHelper.openSession()){
                session.Update(entity);
                return entity;
            }
        }
    }
}

核心项目 csproj 文件

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="NHibernate" Version="5.3.3"/> 
  </ItemGroup>
</Project>

测试项目csproj文件

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>

    <IsPackable>false</IsPackable>
    
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
    <PackageReference Include="xunit" Version="2.4.0" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" />
    <PackageReference Include="coverlet.collector" Version="1.2.0" />
  </ItemGroup>
  <ItemGroup>
  <ProjectReference Include="../ECommercial.Core/ECommercial.Core.csproj" />
  </ItemGroup>
</Project>

标签: c#.netvisual-studio-codenhibernatexunit

解决方案


该问题与 NHibernate 或您的测试项目无关。您可以使用此项目文件轻松重现它:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>
</Project>

您甚至不需要任何 C# 代码。只需构建,您将得到相同的错误。

这是因为您的 SDK 类型是 Web SDK,它希望您的项目是可执行文件。

选项:

  • 将您的 SDK 类型(在Sdk属性中)更改为“Microsoft.NET.Sdk”
  • 添加<OutputType>Library</OutputType>到属性组

您只需要其中一个- 我会使用第一个,除非您出于某种原因需要使用 Web SDK(这是完全可行的)。


推荐阅读