2012-05-16 4 views
2

, кажется, комментарии не могут поддерживать кодRhinomock непримитивного объект ожидания

Допустит, я называю метод (например, SaveTicket) и использовал конструктор (например. Repository, Logging), чтобы ввести различные фиктивные интерфейсы. Если этот метод вызывает другой объект и создает в нем этот примитивный объект. Есть ли простой способ проверить значения этого не примитивного объекта?

Возможно, я пытаюсь заменить этот непримитивный объект свойством и инъекцией, или использовать LastCall.Constraints. Есть ли способ лучше?

Ниже приведен пример - в нижеследующем примере - для проверки Repository.save (t);

вызывается с правильными значениями т я

  1. ли lastcall.constraints

  2. lastcall.ignorearguments

Есть ли лучший способ?

CreateMyTicket(int ticketnumber, string name) 
{ 
    ticketobject t = new ticketObject(ticketnumber, name); 
    t.upgrade = ticketnumber+2; 
    Repository.save(t); 
} 
+1

Не могли бы вы показать код, пожалуйста? Классы и интерфейсы. –

+0

Ты потерял меня. Какой метод является методом, который вы тестируете? Откуда этот «другой объект»? Создается ли это тестируемое устройство или макет? –

+0

обновленный вопрос с кодом. – Qash

ответ

3

Приведем пример. Предположим, что у вас есть следующий класс, и вы хотите модульное тестирование CreateMyTicket метода:

public class ClassToTest 
{ 
    public IRepository Repository { get; private set; } 

    public ClassToTest(IRepository repository) 
    { 
     Repository = repository; 
    } 

    public void CreateMyTicket(int ticketnumber, string name) 
    { 
     var t = new TicketObject(ticketnumber, name); 
     t.Upgrade = ticketnumber + 2; 
     Repository.Save(t); 
    } 
} 

Это предполагает, что мы имеем IRepository интерфейса:

public interface IRepository 
{ 
    void Save(TicketObject t); 
} 

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

[TestMethod] 
public void CreateMyTicketTest() 
{ 
    // arrange 
    var repositoryStub = MockRepository.GenerateStub<IRepository>(); 
    var sut = new ClassToTest(repositoryStub); 
    var ticketNumber = 5; 
    var name = "John"; 

    // act 
    sut.CreateMyTicket(ticketNumber, name); 

    // assert 
    repositoryStub.AssertWasCalled(
     x => x.Save(
      Arg<TicketObject>.Matches(t => 
       t.Upgrade == 7 && 
       t.Name == name && 
       t.TicketNumber == ticketNumber 
      ) 
     ) 
    ); 
} 
+0

Да, это отвечает на него. Благодаря! – Qash

0

Вы должны только проверять, какие методы были вызваны в издевающихся зависимостях (репозиторий, ведение журнала). Проверка объектов, возвращаемых из mocks, ничего не дает (потому что вы проверяете, что вы только что создали вручную и задали как результат возврата).

Смежные вопросы