Как настроить Mock для проверки, если метод вызывается на основе условия в CUT - PullRequest
0 голосов
/ 21 апреля 2020

Delphi 10.3.3 Delphi .Mocks

У меня проблемы с настройкой теста, чтобы определить, был ли вызван метод в Mock на основе условия. В качестве простого примера здесь. Я хочу знать, вызывается ли MyObject.PlaceOrder, когда вызывается MyProjectObject.CheckOutOurStock и запас пуст. CheckOutOurStock вызывает MyObject.PlaceOrder, если IsStockEmpty имеет значение true. Я хочу, чтобы тест не прошел, если я закомментирую вызов MyObject.PlaceOrder.

Настройка макета с помощью Expect (MockMyObject.Setup.Expect.Once.when.PlaceOrder;), конечно, не работает из-за аргумента when. Отключение когда и только MockMyObject.Setup.Expect.Once также не работает.

Я хотел бы просто установить флаг LPlaceOrderWasCalled: Boolean и Assert против этого.

Я подозреваю, что Я после находится в настройке WillExecute, но я не знаю, как это сделать. Я включил подпись метода, закомментированную в тесте. Простая процедура будет работать, но это не то, что ожидает WillExecute. Я нашел только примеры, которые показывают подпись без конкретных примеров.

Любая помощь будет оценена

unit MyObject;

interface

type
    TMyObject = class     
  public
        procedure PlaceOrder;
  end;

implementation

{ TMyObject }

procedure TMyObject.PlaceOrder;
begin
//  Place an order
end;    
end.

unit MyProjectObject;

interface
uses
    MyObject;

type
    TMyProjectObject = class
    private
        FMyObject: TMyObject;
        FIsStockEmpty: Boolean;
    public
        procedure CheckOutOurStock;
        property MyObject: TMyObject read FMyObject write FMyObject;
        property IsStockEmpty: Boolean read FIsStockEmpty write FIsStockEmpty;
    end;

implementation

{ TMyProjectObject }

procedure TMyProjectObject.CheckOutOurStock;
begin
    if IsStockEmpty then
//    MyObject.PlaceOrder;
end;
end

Тест:

procedure
        TMyProjectObjectTest.CheckOutOurStock_WhenIsStockEmptyIsTrue_PlacesOrder;
var
    MockMyObject : TMock<TMyObject>;
  LPlaceOrderWasCalled : Boolean;
begin
  //Arrange
  LPlaceOrderWasCalled := False;
  MockMyObject := TMock<TMyObject>.Create;

  MockMyObject.Setup.Expect.Once.when.PlaceOrder;

    MockMyObject.Setup.WillExecute(
    function(const args: TArray<TValue>; const ReturnType: TRttiType)
    begin
            LPlaceOrderWasCalled := True;
      Result :=  '';
    end).when.PlaceOrder;

  Cut.MyObject := MockMyObject;
  CUT.IsStockEmpty := True;

  //Act
  CUT.CheckOutOurStock;

  //Assert
  Assert.WillNotRaise(
        procedure
        begin
            MockMyObject.Verify();
        end, EMockVerificationException);

  Assert.IsTrue(LPlaceOrderWasCalled);

//  TExecuteFunc = reference to function (const args : TArray<TValue>; const ReturnType : TRttiType) : TValue;
end;


.

1 Ответ

2 голосов
/ 21 апреля 2020

Нельзя издеваться над не виртуальными методами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...