Как я могу утверждать, что определенный метод был вызван с помощью NUnit? - PullRequest
8 голосов
/ 03 декабря 2009

Как я могу проверить, что конкретный метод был вызван с правильными параметрами в результате теста? Я использую NUnit .

Метод ничего не возвращает. он просто пишет в файл. Я использую фиктивный объект для System.IO.File. Поэтому я хочу проверить, была ли вызвана функция или нет.

Ответы [ 4 ]

11 голосов
/ 03 декабря 2009

Требуется больше контекста. Поэтому я добавлю сюда Moq:

pubilc class Calc {
    public int DoubleIt(string a) {
        return ToInt(a)*2;
    }

    public virtual int ToInt(string s) {
        return int.Parse(s);
    }
}

// The test:
var mock = new Mock<Calc>();
string parameterPassed = null;
mock.Setup(c => x.ToInt(It.Is.Any<int>())).Returns(3).Callback(s => parameterPassed = s);

mock.Object.DoubleIt("3");
Assert.AreEqual("3", parameterPassed);
11 голосов
/ 03 декабря 2009

Вы должны использовать некоторые насмешливые фреймворки, такие как Typemock или Rhino Mocks или NMocks2 .

NUnit также имеет Nunit.Mock , но он не очень известен.

Синтаксис для moq можно найти здесь :

var mock = new Mock<ILoveThisFramework>();

// WOW! No record/reply weirdness?! :)
mock.Setup(framework => framework.DownloadExists("2.0.0.0"))
    .Returns(true)
    .AtMostOnce();

// Hand mock.Object as a collaborator and exercise it, 
// like calling methods on it...
ILoveThisFramework lovable = mock.Object;
bool download = lovable.DownloadExists("2.0.0.0");

// Verify that the given method was indeed called with the expected value
mock.Verify(framework => framework.DownloadExists("2.0.0.0"));

Также обратите внимание, что вы можете только смоделировать интерфейс , поэтому, если ваш объект из System.IO.File не имеет интерфейса, то, вероятно, вы не сможете это сделать. Вы должны заключить вызов в System.IO.File в свой собственный класс для работы.

3 голосов
/ 03 декабря 2009

Используя макет для интерфейса.

Допустим, у вас есть класс ImplClass, который использует интерфейс Finder, и вы хотите, чтобы функция Search вызывалась с аргументом "hello";

так что имеем:

public interface Finder 
{
  public string Search(string arg);
}

и

public class ImplClass
{
  public ImplClass(Finder finder)
  {
    ...
  }
  public void doStuff();
}

Тогда вы можете написать макет для вашего тестового кода

private class FinderMock : Finder
{
  public int numTimesCalled = 0;
  string expected;
  public FinderMock(string expected)
  {
    this.expected = expected;
  }
  public string Search(string arg)
  {
    numTimesCalled++;
    Assert.AreEqual(expected, arg);
  }
}

затем тестовый код:

FinderMock mock = new FinderMock("hello");
ImplClass impl = new ImplClass(mock);
impl.doStuff();
Assert.AreEqual(1, mock.numTimesCalled);
2 голосов
/ 17 декабря 2014

В Rhino Mocks, где есть метод с именем AssertWasCalled

Вот способ использовать его

var mailDeliveryManager = MockRepository.GenerateMock<IMailDeliveryManager>();

var mailHandler = new PlannedSending.Business.Handlers.MailHandler(mailDeliveryManager);

mailHandler.NotifyPrinting(User, Info);

mailDeliveryManager.AssertWasCalled(x => x.SendMailMessage(null, null, null), o => o.IgnoreArguments());
...