Я плохо знаком с насмешкой, и мне нелегко решать проблему с UnitTesting.
Скажите, что у меня есть этот код:
public class myClass{
private IDoStuff _doer;
public myClass(IDoStuff doer){
_doer = doer;
}
public void Go(SomeClass object){
//do some crazy stuff to the object
_doer.DoStuff(object) //this method is void too
}
}
Хорошо, таким образом, я хочу к Модульному тесту метод Движения. Я не забочусь о том, что объект _doer делает к объекту, однажды, получает его.
ОДНАКО я действительно хочу осмотреть то, что получил объект _doer.
в ПСЕВДО коде я хочу достигнуть этого:
[Test]
public void MyTest()
{
IDoStuff doer = Mocker.Mock<IDoStuff>();
Guid id = Guid.NewGuid();
//test Go method
new MyClass(doer).Go(new SomeClass(){id = id});
Assert.AreEqual(id,MockingFramework.Method(DoStuff).GetReceived<SomeClass>().id);
}
Этот возможный Носорог использования, и если так, как я достигаю его?
удачи
С новым синтаксисом Arrange / Act / Assert:
[Test]
public void MyTest()
{
// arrange
IDoStuff doer = MockRepository.GenerateStub<IDoStuff>();
MyClass myClass = new Myclass(doer);
Guid id = Guid.NewGuid();
// act
myClass.Go(new SomeClass(){id = id});
// assert
doer.AssertWasCalled(x => x.DoStuff(
Arg<Someclass>.Matches(y => y.id == id)));
}
Я думаю, что то, что у вас есть, хорошо, так что это было бы:
IDoStuff doer = MockRepository.GenerateMock<IDoStuff>();
затем установите ожидание с помощью:
doer.Expect(() => DoStuff(id));
затем в конце:
doer.VerifyAllExpectations();
ИЗМЕНИТЬ из ответов Ли, чтобы отметить что вы также можете делать такие вещи, как:
doer.Expect(d => d.DoStuff(Arg<int>.Is.GreaterThan(5))
или
doer.Expect(d => d.DoStuff(Arg<CustomObject>.Matches(x => x.CustomProperty == "Beef")));
или аналогичные тесты, когда вам не нужны точные сравнения ссылок с использованием объектов Arg и Arg.
Если вы просто хотите проверить, что экземпляр MyClass
передает свой параметр в doer.Go
, вы можете просто установить ожидание:
SomeClass obj = new SomeClass { id = id };
doer.Expect(d => d.DoStuff(obj));
//test go method
new MyClass(doer).Go(obj);
doer.VerifyAllExpectations();
Однако, если вы хотите проверить что он передает какой-то, возможно, другой объект с определенным значением свойства, тогда вы можете использовать ограничение:
doer.Expect(d => d.DoStuff(null))
.IgnoreArguments()
.Constraints(Property.Value("Id", expectedId));
Все эти ответы предлагают различные способы сделать то, что вы хотите, и все они работают. Есть еще одна вещь, о которой следует знать. Если вам нужно получить действительно "низкий уровень" и проверить аргументы, переданные любому заглушенному/мокированному методу, вы можете использовать GetArgumentsForCallsMadeOn
.
Это немного беспорядочный метод, поскольку он возвращает object[][]. Вы используете ее следующим образом (предполагая, что вы поставили заглушку stubber.InsertData
для приема null):
var args = stubber.GetArgumentsForCallsMadeOn(s => s.InsertData(null));
args[0] - массив параметров, переданных InsertData при первом вызове.
args[1] - массив параметров, переданных InsertData при втором вызове.
и т.д.
Итак, если вы хотите увидеть целочисленное значение, переданное в качестве второго параметра при первом вызове какого-либо метода, вы можете:
var check = (int) args[0][1];
Опять же, я бы порекомендовал один из предыдущих методов, но этот доступен, если вам нужно действительно вникнуть и проверить аргументы.