Насмешка над методом, который внутри другого метода, используя 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 в корне композиции.

Другие вопросы по тегам