У меня есть такой тест:
[TestCase("~/page/myaction")]
public void Page_With_Custom_Action(string path) {
// Arrange
var pathData = new Mock<IPathData>();
var pageModel = new Mock<IPageModel>();
var repository = new Mock<IPageRepository>();
var mapper = new Mock<IControllerMapper>();
var container = new Mock<IContainer>();
container.Setup(x => x.GetInstance<IPageRepository>()).Returns(repository.Object);
repository.Setup(x => x.GetPageByUrl<IPageModel>(path)).Returns(() => pageModel.Object);
pathData.Setup(x => x.Action).Returns("myaction");
pathData.Setup(x => x.Controller).Returns("page");
var resolver = new DashboardPathResolver(pathData.Object, repository.Object, mapper.Object, container.Object);
// Act
var data = resolver.ResolvePath(path);
// Assert
Assert.NotNull(data);
Assert.AreEqual("myaction", data.Action);
Assert.AreEqual("page", data.Controller);
}
GetPageByUrl
работает дважды в моем DashboardPathResolver
, как я могу сказать Moq вернуть null
первый раз и pageModel.Object
второй?
c#
unit-testing
nunit
moq
Маркус
источник
источник
SetupSequence()
не работает сCallback()
. Если бы только это было так, можно было бы проверить вызовы в методе «конечного автомата».SetupSequence
работает только для двух вызовов, но что я могу сделать, если нужно более двух вызовов?SetupSequence
может быть использовано для произвольного количества вызовов. Первый пример, который я привел, возвращает последовательность из 5 вызовов.Существующие ответы великолепны, но я подумал, что добавлю свою альтернативу, которая просто использует
System.Collections.Generic.Queue
и не требует каких-либо специальных знаний о фальшивом фреймворке - поскольку у меня их не было, когда я его писал! :)Затем...
источник
Exception
поскольку вы не можете этогоEnqueue
сделать. НоSetupSequence
будет работать (см. Ответ от @stackunderflow, например).Dequeue()
вместо простоDequeue
, вы были бы правы.Добавление обратного вызова не работает для меня, я использовал этот подход вместо этого http://haacked.com/archive/2009/09/29/moq-sequence.aspx, и я закончил с таким тестом:
источник
Вы можете использовать обратный вызов при настройке вашего фиктивного объекта. Взгляните на пример из Moq Wiki ( http://code.google.com/p/moq/wiki/QuickStart ).
Ваша установка может выглядеть так:
источник
Setup()
повторить вызов иReturn()
использовать другое значение.Теперь вы можете использовать SetupSequence. Смотрите этот пост: http://codecontracts.info/2011/07/28/moq-setupsequence-is-great-for-mocking/
источник
Достигнуто здесь для той же проблемы с немного другим требованием.
Мне нужно получить разные возвращаемые значения из mock на основе разных входных значений и найти решение, которое IMO более читабельно, так как использует декларативный синтаксис Moq (linq to Mocks).
источник
da.GetFromDb(0) == new Account { ..None.. && da.GetFromDb(1) == new Account { InActive } && ...
, без-It.Is
лямбда вообще не требуется.Общепринятый ответ , а также SetupSequence ответ , ручки возвращая константы.
Returns()
имеет несколько полезных перегрузок, где вы можете вернуть значение на основе параметров, которые были отправлены в проверяемый метод. Основываясь на решении, приведенном в принятом ответе, вот еще один метод расширения для этих перегрузок.К сожалению, использование метода требует указания некоторых параметров шаблона, но результат все еще вполне читабелен.
Создание перегрузок для метода расширения с несколькими параметрами (
T2
,T3
и т.д.) , если необходимо.источник