Насмешка над методом, который внутри другого метода, используя FakeItEasy
Я хочу издеваться над методом "B", который вызывается внутри метода "A"
Вот пример В приведенном ниже примере я хочу MapPath
всегда возвращать некоторый "текст" всякий раз, когда он вызывается.
Оба находятся в разных классах
public class TestTest
{
public virtual string Test1()
{
ServerPath IFilePath = new ServerPath();
string path = IFilePath.MapPath("folder", "filepath");
return path;
}
}
public class ServerPath
{
public virtual string MapPath(string folder, string filepath)
{
Console.WriteLine("ServerPath");
return (System.Web.Hosting.HostingEnvironment.MapPath(folder + filepath));
}
}
Я хочу издеваться таким образом, чтобы, когда есть вызов MapPath
он всегда должен возвращаться "test25"
(Должен ли я реализовать интерфейс?)
Мой тестовый код:
//I am using FakeitEasy
TestTest TestClass = new TestTest();
var FakeServerPath = A.Fake<ServerPath>();
var FakeTestTest = A.Fake<TestTest>();
A.CallTo(() => FakeServerPath.MapPath(A<string>.Ignored, A<string>.Ignored)).Returns("test25");
//Should I call FakeTestTest.Test1() or TestClass.Test1() ?
Console.WriteLine(TestClass.Test1());
1 ответ
Вы вручную обновляете экземпляр ServerPath
который крепко пары TestTest
к этому. Это делает насмешку немного сложнее. Это должно быть введено в TestTest
как зависимость
Я бы посоветовал абстрагировать зависимость
public interface IFilePath {
string MapPath(string folder, string filepath);
}
public class ServerPath : IFilePath {
public virtual string MapPath(string folder, string filepath) {
Console.WriteLine("ServerPath");
return (System.Web.Hosting.HostingEnvironment.MapPath(folder + filepath));
}
}
и сделать его явной зависимостью TestTest
public class TestTest {
private readonly IFilePath filePath;
public TestTest (IFilePath filePath) {
this.filePath = filePath;
}
public virtual string Test1() {
string path = filePath.MapPath("folder", "filepath");
return path;
}
}
Так что теперь вы можете высмеивать его для тестирования
//Arrange
var expected = "test25";
var FakeServerPath = A.Fake<IFilePath>();
A.CallTo(() => FakeServerPath.MapPath(A<string>.Ignored, A<string>.Ignored))
.Returns(expected);
var sut = new TestTest(FakeServerPath);
//Act
var actual = sut.Test1();
//Assert
Assert.AreEqual(expected, actual);
Наконец, вы должны обязательно зарегистрировать абстракцию и реализацию с контейнером DI в корне композиции.