Первая проблема связана с попыткой использования out
с Is.A<string>()
.
Вторая причина заключается в том, что делегат, определенный для обработки вызова, не соответствует ожидаемому, поскольку определение delegate
в лямбде не может иметь out
.
Я решил это, сначала создав отдельный делегат, который соответствует предмету, который нужно смоделировать
delegate bool StubForStaticImages(string id, out string path);
, и использовал его при определении прокладки. Остальное было просто следствием следующих примеров в документации.
Для целей тестирования я определил поддельный субъект
class FileOps {
public static bool ImagesExistsInDirectory(string ruleId, out string advertise_path) {
advertise_path = "test";
return false;
}
}
Следующий пример ведет себя, как и ожидалось, при выполнении теста
[TestMethod]
public void Pose_Static_Shim_Demo_With_Out_Parameter() {
//Arrange
var path = Is.A<string>();
var expectedResult = true;
var expectedPath = "Hello World";
var expectedId = "id";
string actualId = null; ;
StubForStaticImages stub = new StubForStaticImages((string a, out string b) => {
b = expectedPath;
actualId = a;
return expectedResult;
});
Shim shim = Shim
.Replace(() => FileOps.ImagesExistsInDirectory(Is.A<string>(), out path))
.With(stub);
//Act
string actualPath = default(string);
bool actualResult = default(bool);
PoseContext.Isolate(() => {
actualResult = FileOps.ImagesExistsInDirectory(expectedId, out actualPath);
}, shim);
//Assert - using FluentAssertions
actualResult.Should().Be(expectedResult); //true
actualPath.Should().Be(expectedPath); //Hello World
actualId.Should().Be(expectedId); //id
}
Обратите внимание на то, что выше только демонстрирует функциональность самого фреймворка. Сделайте необходимые изменения для ваших реальных испытаний.