首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >找不到无参数构造函数

找不到无参数构造函数
EN

Stack Overflow用户
提问于 2020-05-28 04:38:21
回答 1查看 542关注 0票数 1

我是单元测试和Moq的新手。我写了4个抛出相同异常的测试,我想我需要在模拟CharacterRepository时添加这些参数CombatHelperContext,IMapper,但是我该怎么做呢?

我的目标是测试crud功能、视图等。

代码语言:javascript
运行
复制
public class CharacterTests
{
    [Fact]
    public async Task GetAll_ReturnsAViewResult_WithAListOfCharacters()
    {
        // Arrange
        var mockRepo = new Mock<CharacterRepository>();
        mockRepo.Setup(repo => repo.GetAll())
        .Returns(GetTestCharacters());
        var controller = new CharacterController(mockRepo.Object);

        // Act
        var result = await controller.Get();

        // Assert
        var viewResult = Assert.IsType<ViewResult>(result);
        var model = Assert.IsAssignableFrom<List<CharacterDto>>(
            viewResult.ViewData.Model);

        Assert.Equal(4, model.Count());
    }

    [Fact]
    public async Task Delete_Character()
    {
        // Arrange
        var mockRepo = new Mock<CharacterRepository>();
        mockRepo.Setup(repo => repo.Delete(1));

        var controller = new CharacterController(mockRepo.Object);
        var characters = GetTestCharacters();

        // Act
        var result = await controller.Get();

        // Assert
        Assert.Null(characters.Where(c => c.Id == 1));
    }

    [Fact]
    public async Task Post_NewCharacter_ReturnsInViewResult()
    {
        // Arrange
        CharacterDto newCharacterDto = new CharacterDto();
        newCharacterDto.Id = 5;

        var mockRepo = new Mock<CharacterRepository>();
        mockRepo.Setup(repo => repo.Add(newCharacterDto));

        var controller = new CharacterController(mockRepo.Object);
        var characters = GetTestCharacters();

        // Act
        var result = await controller.Get();

        // Assert
        var viewResult = Assert.IsType<ViewResult>(result);
        var model = Assert.IsAssignableFrom<List<CharacterDto>>(
            viewResult.ViewData.Model);

        Assert.Equal(5, model.Count());
    }

    [Fact]
    public async Task Update_Character()
    {
        // Arrange
        var mockRepo = new Mock<CharacterRepository>();
        var characters = GetTestCharacters();
        CharacterDto characterToUpdate = characters.FirstOrDefault(c => c.Name == "Zero Two");
        var controller = new CharacterController(mockRepo.Object);

        // Act
        var result = await controller.Get();
        characterToUpdate.Name = "Zero Three";
        mockRepo.Setup(repo => repo.Update(characterToUpdate));

        // Assert
        Assert.NotNull(characters.FirstOrDefault(c => c.Name == "Zero Three"));
    }


    private IQueryable<CharacterDto> GetTestCharacters()
    {
        var characters = new List<CharacterDto>();
        characters.Add(new CharacterDto()
        {
            Id = 1,
            Name = "Zero Two"
        });
        characters.Add(
            new CharacterDto
            {
                Id = 2,
                Name = "Ander"
            });
        characters.Add(
            new CharacterDto
            {
                Id = 3,
                Name = "Jingles"
            });
        characters.Add(new CharacterDto
        {
            Id = 4,
            Name = "Arthas Menethil"
        });
        var queryableCharacters = characters.AsQueryable();
        return queryableCharacters;
    }
}

这是我正在模拟的存储库

代码语言:javascript
运行
复制
public class CharacterRepository : MappingRepository<Character, CharacterDto>
{
    public CharacterRepository(CombatHelperContext combatHelperContext, IMapper mapper) : base(combatHelperContext, mapper)
    {
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-05-28 04:54:10

依赖于抽象而不是实现-创建存储库接口:

代码语言:javascript
运行
复制
public interface ICharacterRepository
{
    IEnumerable<Character> GetAll();
    void Delete(int id);
    void Add(Character character);
}

现在,模仿就像一种护身符:

代码语言:javascript
运行
复制
var mockRepo = new Mock<ICharacterRepository>();

还可以考虑使用AutoFixtureNBuilder之类的工具来生成测试对象。

代码语言:javascript
运行
复制
[Fact]
public async Task GetAll_Returns_ViewResult_With_List_Of_Characters()
{
    // Arrange
    var fixture = new Fixture();
    var characters = fixture.CreateMany<Character>();
    var mockRepo = new Mock<ICharacterRepository>();
    mockRepo.Setup(repo => repo.GetAll()).Returns(characters);
    var controller = new CharacterController(mockRepo.Object);

    // Act
    var result = await controller.Get();

    // Assert
    var viewResult = Assert.IsType<ViewResult>(result);
    var model = Assert.IsAssignableFrom<List<CharacterDto>>(viewResult.ViewData.Model);

    Assert.Equal(characters.Count(), model.Count());
}

如果您不能更改当前实现并依赖于接口,那么您应该将构造函数参数作为参数列表提供给new mock:

代码语言:javascript
运行
复制
var combatHelperContext = new CombatHelperContext();
var mapperMock = new Mock<IMapper>();
var mockRepo = new Mock<CharacterRepository>(combatHelperContext, mapperMock.Object);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62052476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档