Hossein Soleymani Far
Hossein Soleymani Far

Reputation: 61

how to resolve dependency injection in xunit?

I have a problem in creating a test unit using xunit for my services that use dependency injection.

How can i send my dependency to test class?

    [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);
    }

Upvotes: 2

Views: 6356

Answers (2)

Create a startup.cs file then map the dbcontext and the irepositoryDB specification to RepositoryDB concrete class. Dependency inject the IrepositoryDB in the xunit class constructor.

  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);
    }

Upvotes: 0

Felipe Su&#225;rez
Felipe Su&#225;rez

Reputation: 39

You need to mock the dependencies using another library, the most popular one is Moq

So, assuming you have a class like this with a dependency injected:

public class ScrapedJobService : IScrapedJobService
{
    private readonly IScrapedJobRepository _scrapedJobRepository;

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

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

You need mock that dependency like this:

    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);
    }

Upvotes: 1

Related Questions