Как конвертировать из Moq в NS заменить этот код? - PullRequest
0 голосов
/ 06 февраля 2020

Moq:

var someService = new Mock<ISomeService>();
var data = new ...;

someService.Setup(x => x.UpdateAsync(It.IsAny<Action<OneClass, TwoClass>>()))
    .Callback<Action<OneClass, TwoClass>>((func) =>
    {
        func(data);
    })
    .Returns(Task.CompletedTask);

UpdateAsync есть действие (первый параметр).

Я хочу выполнить действие.

Я пытался

someService
    .UpdateAsync(Arg.Do<Action<OneClass, TwoClass>>(x => x(data)))
    .Returns(Task.CompletedTask);

но это не сработало.

Как это сделать с помощью NSubstitute?

1 Ответ

1 голос
/ 06 февраля 2020

У вас есть действие, которое принимает два аргумента, но вы пытаетесь вызвать его, используя только один

В следующем примере теста проверяется ожидаемое поведение и то, что фреймворк на самом деле ведет себя как ожидалось.

[TestClass]
public class MyTestClass {
    [TestMethod]
    public async Task Should_Invoke_Callback() {
        //Arrange
        var someService = Substitute.For<ISomeService>();
        OneClass one = new OneClass();
        TwoClass two = new TwoClass();

        someService
            .UpdateAsync(Arg.Do<Action<OneClass, TwoClass>>(action => action(one, two)))
            .Returns(Task.CompletedTask);

        bool invoked = false;

        Action<OneClass, TwoClass> callback = (a, b) => {
            invoked = a != null && b != null;
        };

        //Act
        await someService.UpdateAsync(callback);

        //Assert - using FluentAssertions
        invoked.Should().BeTrue();
    }
}

public class TwoClass {
}

public class OneClass {
}

public interface ISomeService {
    Task UpdateAsync(Action<OneClass, TwoClass> action);
}

Ссылка Действия с сопоставителями аргументов

...