【问题标题】:how to resolve dependency injection in xunit?如何解决xunit中的依赖注入?
【发布时间】:2018-06-19 11:12:22
【问题描述】:

我在使用 xunit 为使用依赖注入的服务创建测试单元时遇到问题。

如何将我的依赖项发送到测试类?

    [Fact]
    public async Task GetAllRequestsHavePagingNoFilterNoSortAsync()
    {
        requestViewModel.RemotePaging = true;
        requestViewModel.PageSize = 10;
        requestViewModel.Page = 1;
        var x = await requestService.GetAsync(requestViewModel);
        Assert.NotNull(x);
        Assert.True(x.PageCount == requestViewModel.PageSize);
    }

【问题讨论】:

  • 这是哪种编程语言?你能分享更多的背景吗?
  • .net 核心中的 c#
  • 试试这个 xunit 框架内置的 xunit di 支持:nuget.org/packages/Xunit.Di.

标签: unit-testing dependencies xunit testunit


【解决方案1】:

您需要使用另一个库来模拟依赖项,最流行的是Moq

所以,假设你有一个像这样的类并注入了依赖项:

public class ScrapedJobService : IScrapedJobService
{
    private readonly IScrapedJobRepository _scrapedJobRepository;

    public ScrapedJobService(IScrapedJobRepository scrapedJobRepository)
    {
        _scrapedJobRepository = scrapedJobRepository;
    }

    public WorkingPlace FindWorkingPlace(string title)  
    {
     ...
   }
}

您需要像这样模拟该依赖项:

    using Moq;
    using Xunit;

    private readonly ScrapedJobService _sut;
    private readonly Mock<IScrapedJobRepository> _scrapedJobRepo = new Mock<IScrapedJobRepository>();

    public ScrapedJobServiceTest()
    {
        _sut = new ScrapedJobService(_scrapedJobRepo.Object);
    }

    [Fact]
    public void Test()
    {
        var result = _sut.FindWorkingPlace("Remote");
        Assert.Equal(WorkingPlace.Remote, result);
    }

【讨论】:

    【解决方案2】:

    创建一个 startup.cs 文件,然后将 dbcontext 和 irepositoryDB 规范映射到 RepositoryDB 具体类。依赖注入到 xunit 类构造函数中的 IrepositoryDB。

      namespace XUnitTestProject1
      {
          public class Startup 
          {
    
           public void ConfigureServices(IServiceCollection services)
           {
               var configuration = new ConfigurationBuilder()
              .SetBasePath(System.IO.Directory.GetCurrentDirectory())
              .AddJsonFile("appsettings.Development.json", false, true)
              .Build();
    
              services.AddControllers();
    
              var connectionString = configuration.GetConnectionString("My_DbCoreConnectionString");
            services.AddDbContext<MY_DB_Context>(options2 => options2.UseSqlServer(connectionString));
    
            services.AddTransient<IRepositoryDB, RepositoryDB>();
    
         }
       }
     }
    

    XUnit

      public class UnitTest1
       {
        private readonly IRepositoryDB _repository;
        public UnitTest1(IRepositoryDB repository)
        {
            _repository = repository;
        }
    
       public async Task GetItems(long id)
        {
            IList<myItem> list= await _repository.GetItems(id);
            Assert.True(list.Count>0);
        }
    

    【讨论】:

      猜你喜欢
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      相关资源
      最近更新 更多