Как смоделировать вывод TXT? - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть текст, к которому у лога c есть доступ через репозиторий. Я хочу определить, что когда я вызываю метод Write из logi c, метод Write для репозиториев вызывается один раз. Мой код:

    [Test]
    public void TestThatWriteWasCalledOnce()
    {
        Mock<IRepository> mockinstance = new Mock<IRepository>();
        LogicSaveGame logic = new LogicSaveGame(mockinstance.Object);
        //mockinstance.Setup(x => x.Write(It.IsAny<string>(), It.IsAny<string>())).  //???
        logic.Write(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>());
        mockinstance.Verify(x => x.Write(It.IsAny<string>(), It.IsAny<string>()), Times.Once());
    }

Когда я запускаю тест, описанный выше, я получаю сообщение об ошибке:

Message: 
System.ArgumentNullException : Value cannot be null.
Parameter name: value
Stack Trace: 
XAttribute.ctor(XName name, Object value)

Я очень благодарен за любую помощь, не могу найти что-нибудь с Google.

Правка, логическая игра:

    private readonly IRepository saveGameRepo;

    public LogicSaveGame(IRepository repo)
    {
        this.saveGameRepo = repo;
    }

    public void Write(string name, string a, string b, string filename)
    {
        int ids = this.saveGameRepo.GetIds(filename);
        var xd = new XElement(
            "game",
            new XAttribute("id", ids + 1),
            new XAttribute("name", name),
            new XAttribute("hour", DateTime.Now.Hour),
            new XAttribute("minute", DateTime.Now.Minute),
            new XElement(
            "player1",
            new XElement("name", a.Name),
            new XElement(
            "player2",
            new XElement("name", b.Name),
            ));
        this.saveGameRepo.Write(filename, xd.ToString());
    }

Правка 2: я получаю ту же ошибку с mockinstance.Setup (x => x.Write (It.IsAny (), It.IsAny ()) ) .Verifiable ();

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

TL; DR

Чтобы устранить проблему, перейдите к вызову метода logic.Write конкретные string значения, например:

logic.Write("name", "a", "b", "filename");

Пояснение

Проблема не в насмешках IRepository. Проблема в том, как вы вызываете метод logic.Write. Вы передаете ему параметры, используя It.IsAny<string>(). Метод It.IsAny<string>() возвращает null значение, поэтому во время выполнения ваш метод logic.Write вызывается со следующими значениями:

logic.Write(null, null, null, null);

Внутри метода logic.Write вы создаете XAttribute("name", name) , Документация говорит, что этот конструктор требует, чтобы оба его параметра были не нулевыми. В тесте он вызывается со значением null переменной name, поэтому создается исключение System.ArgumentNullException : Value cannot be null, указывающее на конструктор XAttribute.ctor(XName name, Object value). Поэтому, чтобы решить проблему, необходимо передать методу logic.Write ненулевые строковые значения.

0 голосов
/ 22 апреля 2020

Я чувствую, что вы забыли правильно настроить макет перед вызовом вашего LogicSaveGame (который, очевидно, сохраняет файл XML) Вы можете обратиться к этой ссылке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...