Как может я использовать Насмешки Носорога для осмотра, какие значения были переданы методу

Я плохо знаком с насмешкой, и мне нелегко решать проблему с 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);
}

Этот возможный Носорог использования, и если так, как я достигаю его?

удачи

17
задан andy 12 July 2010 в 13:36
поделиться

4 ответа

С новым синтаксисом 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)));
}
24
ответ дан 30 November 2019 в 11:26
поделиться

Я думаю, что то, что у вас есть, хорошо, так что это было бы:

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.

5
ответ дан 30 November 2019 в 11:26
поделиться

Если вы просто хотите проверить, что экземпляр 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));
1
ответ дан 30 November 2019 в 11:26
поделиться

Все эти ответы предлагают различные способы сделать то, что вы хотите, и все они работают. Есть еще одна вещь, о которой следует знать. Если вам нужно получить действительно "низкий уровень" и проверить аргументы, переданные любому заглушенному/мокированному методу, вы можете использовать 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];

Опять же, я бы порекомендовал один из предыдущих методов, но этот доступен, если вам нужно действительно вникнуть и проверить аргументы.

7
ответ дан 30 November 2019 в 11:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: