Не удалось найти конструктор без параметров - PullRequest
0 голосов
/ 27 мая 2020

Я новичок в модульном тестировании и Moq. Я написал 4 теста, которые все выдают одно и то же исключение, и я думаю, что мне нужно добавить эти параметры CombatHelperContext, IMapper при имитации CharacterRepository, но как мне это сделать? .

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

Репозиторий, над которым я издеваюсь

public class CharacterRepository : MappingRepository<Character, CharacterDto>
{
    public CharacterRepository(CombatHelperContext combatHelperContext, IMapper mapper) : base(combatHelperContext, mapper)
    {
    }
}

1 Ответ

1 голос
/ 27 мая 2020

Зависит от абстракции, а не от реализации - создайте интерфейс репозитория:

public interface ICharacterRepository
{
    IEnumerable<Character> GetAll();
    void Delete(int id);
    void Add(Character character);
}

Теперь насмешка работает как шарм:

var mockRepo = new Mock<ICharacterRepository>();

Также рассмотрите возможность использования чего-то вроде AutoFixture или NBuilder для генерации тестовых объектов.

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

Если вы не можете изменить текущую реализацию и зависят от интерфейса, тогда вы должны предоставить аргументы конструктора в виде списка параметров для нового макета:

var combatHelperContext = new CombatHelperContext();
var mapperMock = new Mock<IMapper>();
var mockRepo = new Mock<CharacterRepository>(combatHelperContext, mapperMock.Object);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...