Тестирование XUnit с использованием Autofac.Extras.Moq

Я новичок в модульном тестировании. Ниже приведен код для модульного тестирования с использованием xunit.

public class FloorManager
{
    public List<FloorInfo> Floors { get; }

    public FloorManager()
    {
        Floors = new List<FloorInfo>();
        SelectedFloor = -1;
    }        

    public FloorInfo FindFloorByName(string name)
    {
        FloorInfo fInfo = Floors.Find(floor => floor.Name == name);
        return fInfo;
    }
}

public class FloorInfo
{
    public String Name { get; set; }
}

У меня есть тест на это:

[Fact]
public void FindFloorByName_ShouldGetName()
{
    using (var mock = AutoMock.GetLoose())
    {
        string floorName = "First Floor";
        var fInfo = new FloorInfo { Name = floorName };
        mock.Mock<FloorManager>()
            .Setup(x => x.FindFloorByName(floorName)).Returns(fInfo);

        var cls = mock.Create<FloorManager>();
        var expected = "First Floor";

        var actual = cls.FindFloorByName(floorName);

        Assert.True(expected == actual.Name);
    }
}

но когда я запускаю тест, он дает мне ошибку: -

> `System.NotSupportedException : Unsupported expression: x => x.FindFloorByName(FloorManagerTests.<>c__DisplayClass0_0.floorName)`

Пожалуйста, дайте мне решение, как проверить вышеуказанную функцию, чтобы пройти тестовый пример


person Omkar    schedule 09.10.2019    source источник


Ответы (1)


В показанном примере кода, приведенном в исходном вопросе, нет ничего, что можно было бы высмеивать.

Кроме того, тестируемый объект (SUT) обычно не подвергается насмешкам при изолированном модульном тестировании.

Учитывая следующий класс в качестве примера

public class FloorManager {
    private List<FloorInfo> floors;

    public FloorManager() {
        floors = new List<FloorInfo>();
    }

    public IEnumerable<FloorInfo> Floors => floors;

    public FloorInfo FindFloorByName(string name) {
        FloorInfo fInfo = floors.Find(floor => floor.Name == name);
        return fInfo;
    }

    public  void Add(FloorInfo floor) {
        floors.Add(floor);
    }
}

public class FloorInfo {
    public String Name { get; set; }
}

Некоторые простые тесты для публичных членов предметного класса

[TestClass]
public class FloorManagerTests {
    [TestMethod]
    public void Should_Create_Default_FloorManager() {
        //Arrange
        FloorManager subject = null;

        //Act
        subject = new FloorManager();

        //Assert - FluentAssertions
        subject.Should().NotBeNull();
        subject.Floors.Should()
            .NotBeNull()
            .And.HaveCount(0);
    }

    [TestMethod]
    public void Should_Add_Floor() {
        //Arrange
        string floorName = "First Floor";
        var floor = new FloorInfo { Name = floorName };
        var subject = new FloorManager();

        //Act
        subject.Add(floor);

        //Assert - FluentAssertions
        subject.Floors.Should().HaveCount(1);
    }

    [TestMethod]
    public void Should_FindFloorByName() {
        //Arrange
        string expected = "First Floor";
        var floor = new FloorInfo { Name = expected };
        var subject = new FloorManager();
        subject.Add(floor);

        //Act
        FloorInfo actual = subject.FindFloorByName(expected);

        //Assert - FluentAssertions
        actual.Should().NotBeNull();
        actual.Name.Should().Be(expected);
    }
}

И по мере усложнения предметного класса можно добавлять дополнительные тесты для проверки ожидаемого поведения.

Если бы вместо этого менеджер зависел от службы

Например,

public class FloorManager {
    private IFloorCollection floors;

    public FloorManager(IFloorCollection floors) {
        this.floors = floors;
    }

    public IEnumerable<FloorInfo> Floors => floors.All;

    public FloorInfo FindFloorByName(string name) {
        FloorInfo fInfo = floors.Find(floor => floor.Name == name);
        return fInfo;
    }

    public void Add(FloorInfo floor) {
        floors.Add(floor);
    }
}

public interface IFloorCollection {
    IEnumerable<FloorInfo> All { get; }
    void Add(FloorInfo floor);
    FloorInfo Find(Func<FloorInfo, bool> p);

}

public class FloorInfo {
    public String Name { get; set; }
}

Тогда возникнет необходимость имитировать зависимость, чтобы протестировать объект изолированно.

[TestMethod]
public void Should_FindFloorByName() {
    using (var mock = AutoMock.GetLoose()) {
        //Arrange
        string expected = "First Floor";
        var floor = new FloorInfo { Name = expected };
        FloorManager subject = mock.Create<FloorManager>();
        mock.Mock<IFloorCollection>()
            .Setup(_ => _.Find(It.Is<Func<FloorInfo, bool>>(f => f(floor))))
            .Returns(floor);

        //Act
        FloorInfo actual = subject.FindFloorByName(expected);

        //Assert - FluentAssertions
        actual.Should().NotBeNull();
        actual.Name.Should().Be(expected);
    }
}
person Nkosi    schedule 09.10.2019