Метод Nunit -Check был вызван с параметром - PullRequest
1 голос
/ 18 апреля 2020

Тест должен проверить правильность работы метода AddDebug. Поэтому, если имя пользователя равно нулю, оно автоматически установит имя пользователя на «Anononymus». Однако я не вижу списка, потому что он закрытый, поэтому единственный способ проверить, работает ли функция правильно, - это воспользоваться той возможностью, что метод AddDebug вызывает метод Add. Я должен убедиться, что метод Add был вызван с параметром «Anonymous», я могу использовать только Nunit, Mock теперь не является обязательным для меня.

private List<Log> Entries;
    public Logger()
    {
        Entries = new List<Log>();
    }
    public void Add(string text, LogLevels level, DateTime timeStamp, string userName)
    {
        var Enitity = new Log();
        Enitity.Text = text;
        Enitity.Level = level;
        Enitity.TimeStamp = timeStamp;
        Enitity.UserName = userName;
        Add(Enitity);

    }
    public void Add(Log log)
    {
        if (!(log.TimeStamp > DateTime.Now))
        {
            Entries.Add(log);
        }
    }
    public void AddDebug(string text, string userName = null)
    {
        if (String.IsNullOrEmpty(userName) == true)
        {
            Add(text, LogLevels.Debug, DateTime.Now, "Anonymus");
        }
        else
        {
            Add(text, LogLevels.Debug, DateTime.Now, userName);
        }

    }

Ответы [ 2 ]

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

Учитывая факты:

  • вы не можете редактировать Logger класс, который не подходит для модульных тестов
  • реализация не предоставляет Entries в качестве открытой c информации, и он не может быть передан в Logger как параметр
  • . Ни один из методов не является виртуальным.

Вы должны использовать Reflection, чтобы получить Entries.

var logger = new Logger();
logger.AddDebug("some text", userName: null);

// Get Entries in logger
var entriesField = typeof(Logger).GetField(
    "Entries", BindingFlags.NonPublic | BindingFlags.Instance);
var entries = (List<Log>)entriesField.GetValue(logger);
var containsAnonymous = entries.Any(e => e.UserName == "Anonymus");

Тем не менее, это обычно / возможно не считается хорошей практикой в ​​модульном тестировании, так как это зависит от внутренних элементов класса Logger, и вполне вероятно, что если вы измените реализацию Logger, этот модульный тест может перерыв.

Я бы по-прежнему рекомендовал использовать одно из решений @ user8606929, если это возможно.

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

Я бы порекомендовал вам использовать Mocking Framework, такой как Moq. Смотрите мой прикрепленный пример кода. ILog - это интерфейс для класса журнала.

public interface ILog {
 void Add(Log log);
}

Ваш класс Logger может выглядеть следующим образом:

public class Logger : ILog{
....
public void Add(Log log)
   {
       if (!(log.TimeStamp > DateTime.Now))
        {
            Entries.Add(log);
        }
   }
}
...

Вы можете создать свой TestCases следующим образом

using Moq;

public class TestLogger 
{
  private Mock<ILog> _logMock;
  private ILog _logger;


  [Setup]
  public void SetUp()
  {

  _logMock = new Mock<ILog>();
  _logMock.Setup(a => a.Add(It.IsAny<Log>())).Verifiable(); // check if method is called

  _logger = _logMock.Object;          
  }

...

  [Test]
  public void SomeTest()
  {
   //test some business logik - inject your logger instance into businesslogic class

   //check if logger was called once
  _logMock.Verify(a => a.Add(It.IsAny<Log>()), Times.Once); 
  }

}


Если невозможно использовать Moq и внешние интерфейсы, вы можете написать свой тест, чтобы проверить, не является ли ваш список записей не пустым.

public class Logger
{
  public List<Log> Entries = new List<Log>();

  ...
}
[TestCaseSource(nameof(something))]
    public void AddDebugSetAnonymusUserTest()
    {
        var logger = new Logger();
        logger.AddDebug("Text", null);

       //here is the check if AddDebug was successful
       Assert.AreEqual(1, logger.Entries.Count);

       //check if user was anonymous
       Assert.AreEqual("Anonymous", logger.Entries.FirstOrDefault().UserName);
    }

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