Убедитесь, что два разных метода вызывают одинаковые методы для объекта - PullRequest
1 голос
/ 19 февраля 2020

Я использую Moq в качестве основы для насмешек. У меня есть ситуация, когда я хочу выполнить два разных метода, которые оба вызывают методы интерфейса. Я хочу убедиться, что оба метода вызывают в моем интерфейсе одни и те же методы, в том же порядке и с одинаковыми параметрами. Для иллюстрации приведем код:

[TestMethod]
public void UnitTest()
{
var classToTest = new ClassToTest();
Mock<IMyInterface> mock1 = new Mock<IMyInterface>();
// Setup the mock
Mock<IMyInterface> mock2 = new Mock<IMyInterface>();
// Setup the mock


classToTest.MethodToTest(mock1.Object);
classToTest.DifferentMethodToTest(mock2.Object);

// here I need help:
mock1.Verify(theSameMethodsAsMock2);
}

Например, если IMyInterface имеет два метода, Method1(int i) и Method2(string s), тест должен пройти, если MethodToTest имеет структуру

void MethodToTest(IMyInterface x)
{
x.Method1(42);
x.Method2("example");
x.Method1(0);
}

и DifferentMethodToTest выглядит так:

void MethodToTest(IMyInterface x)
{
int a = 10 + 32;
x.Method1(a);
string s = "examples";
x.Method2(s.Substring(0, 7));
x.Method1(0);
// might also have some code here that not related to IMyInterface at all, 
// e.g. calling methods in other classes and so on
}

Тот же порядок, те же методы, те же параметры. Это возможно с Moq? Или мне нужен еще один насмешливый фреймворк?

1 Ответ

0 голосов
/ 20 февраля 2020

Я сам нашел решение, которое использует InvocationAction:

[TestMethod]
public void Test()
{
var classToTest = new ClassToTest();

var methodCalls1 = new List<string>();
var invocationAction1 = new InvocationAction((ia) =>
{
     string methodCall = $"{ia.Method.Name} was called with parameters {string.Join(", ", ia.Arguments.Select(x => x?.ToString() ?? "null"))}";
     methodCalls1.Add(methodCall);
});
Mock<IMyInterface> mock1 = new Mock<IMyInterface>();
mock1.Setup(x => x.Method1(It.IsAny<int>())).Callback(invocationAction1);
mock1.Setup(x => x.Method2(It.IsAny<string>())).Callback(invocationAction1);

// Same for mock2 ...


classToTest.MethodToTest(mock1.Object);
classToTest.DifferentMethodToTest(mock2.Object);

CollectionAssert.AreEqual(methodCalls1, methodCalls2);
}

Я знаю, что код очень неуклюжий, особенно сравнения строк, но на данный момент этого достаточно.

...