简体   繁体   English

使用 xunit 测试时如何在控制器中传递注入的服务

[英]how to pass injected service in controller when using xunit test

I have dot net core (v5) web api porject.我有 dot net core (v5) web api 项目。

I want to make a Xunit test for testing my web api.我想做一个Xunit test来测试我的 web api。

I have a UsersController for CRUD .我有一个CRUDUsersController in my Constructor i have 4 input as shown below:在我的构造函数中,我有 4 个输入,如下所示:

public UsersController(AppDbContext _appDbContext, IMapper _mapper, IOptions<SieveOptions> sieveOptions, SeiveProcessorService sieveProcessorService) : base(_appDbContext, _mapper)
{
      _sieveProcessorService = sieveProcessorService;
      _sieveOptions = sieveOptions.Value;
}

SeiveProcessorService its a Service in my project. SeiveProcessorService它是我项目中的一项Service

I can pass three input in my test unit but i can't pass last input.我可以在我的测试单元中传递三个输入,但我不能传递最后一个输入。

i dont know how to send to controller我不知道如何发送给控制器

my test code is :我的测试代码是:

        [Fact]
        public void Test_GetList()
        {
            using (var context = new AppDbContext(ContextOptions))
            {

                //auto mapper configuration
                var mockMapper = new MapperConfiguration(cfg =>
                {
                    cfg.AddProfile(new MappingProfile(null));
                });
                var mapper = mockMapper.CreateMapper();

                //
                SieveOptions sieveOptions = new SieveOptions() { 
                    CaseSensitive = false,
                    DefaultPageSize = 50,
                    MaxPageSize = 500,
                    ThrowExceptions = true,
                };
                IOptions<SieveOptions> options = Options.Create(sieveOptions);

                // Arrange
                var controller = new UsersController(context, mapper, options,????);

                // Act
                var result = controller.GetList(null);

                // Assert
                var viewResult = Assert.IsType<IResult>(result);
                Assert.Null(viewResult);
            }
        }
    }

I don't know how can send fourth input?我不知道如何发送第四个输入?

Create ISeiveProcessorService intrerface and mock it in your unit testing.创建ISeiveProcessorService接口并在您的单元测试中mock它。

public interface ISeiveProcessorService
{
    void A();
}

public class SeiveProcessorService : ISeiveProcessorService
{
    // implement interface methods
    public void A()
    {
    }
}

UPDATE更新

in order to use Moq you need to install and import namespace.为了使用起Moq量,您需要安装和导入命名空间。 And in your test method:在你的测试方法中:

Mock<ISeiveProcessorService> _mockSeiveProcessorService new Mock<ISeiveProcessorService>();
  
// set up moq  
_mockSeiveProcessorService.Setup(e => e.A()).Returns("Something");
                      
var controller = new UsersController(context, mapper, options,_mockSeiveProcessorService.Object);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM