Nasıl PascalMock açık dizi parametresi olan bir yöntem alay ediyorsun?

oy
2

Ben birim test ile başlayan ve iyiliği için alay alma sürecinde şu anda olduğum ve ben için bir çalışma sahte uygulama üretmek gibi olamaz aşağıdaki yöntemle sendeledi:

function GetInstance(const AIID: TGUID; 
                       out AInstance; 
                     const AArgs: array of const; 
                     const AContextID: TImplContextID = CID_DEFAULT): Boolean;

( TImplContextIDInteger için sadece bir tip diğer adıdır)

Bu bende ne kadar geçerli:

function TImplementationProviderMock.GetInstance(
  const AIID: TGUID;
    out AInstance;
  const AArgs: array of const;
  const AContextID: TImplContextID): Boolean;
var
  lCall: TMockMethod;
begin
  lCall := AddCall('GetInstance').WithParams([@AIID, AContextID]);
  Pointer(AInstance) := FindVarData(lCall.OutParams[0]).VPointer;
  Result := lCall.ReturnValue;
end;

Ben açık dizi parametreyi alay nasıl beklenir Ama anlamaya edemedik AArgs. Herhangi bir fikir?

Ayrıca, geri dönmek için daha basit bir yolu belki orada out-parametre AInstanceve kullandığı @için -notation TGUID-typed parametresi (aslında bir rekor, yani bir değer türü) sağ tarafa gitmek?

hepsi de PascalMock güncel sürümüyle bu yöntemi alay etmek mümkün mü?


Güncelleme 2: Ben şimdi netlik için soru metni aşağı kestik. Asıl olarak Mason'ın cevap atıfta neydi sahte yöntemin aşağıdaki hatalı uygulanmasını içeriyordu:

function TImplementationProviderMock.GetInstance(
  const AIID: TGUID;
    out AInstance;
  const AArgs: array of const;
  const AContextID: TImplContextID): Boolean;
begin
  Result := AddCall('GetInstance')
           .WithParams([@AIID, AContextID])
           .ReturnsOutParams([AInstance])
           .ReturnValue;
end;

Bu ise derleyici şikayet .ReturnsOutParams([AInstance])söyleyerek değişken türü dizi yapıcı Bad argüman türü..

Oluştur 20/05/2010 saat 13:30
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
0

Görünüşe ReturnsOutParamsbir beklediği const dizi TVarRec bir dizi olarak dahili olarak uygulanan,. TVarRec çeşit varyantı ancak farklı gibi bir kayıttır ve derleyici doldurmak için daha tanımlı bir tür gerektirir. Türlenmemiş parametre içine gitmeyecek.

Bu tür şeyler belki ama TVarRec ile, Delphi 2010 en uzun RTTI ile yapılabilir.

Cevap 20/05/2010 saat 14:28
kaynak kullanıcı

oy
0

testin uygulayıcısı sahte dahili olarak uygulanan bilir gerektirir çünkü artık OO- POV tam ideal değildir biraz ayrıntılı çözüm ile geldim ama hala hiçbir varsayım olabildiğince biraz kabul edilebilir olduğunu düşünüyorum Neyse (derlemek istiyorum en azından hiçbiri) bir açık dizi argüman beklentisini nasıl belirtileceği başka hakkında yaptı.

Yani, bu benim alay yöntemin uygulanması artık neye benzediği:

function TImplementationProviderMock.GetInstance(
  const AIID: TGUID;
    out AInstance;
  const AArgs: array of const;
  const AContextID: TImplContextID): Boolean;
var
  lCall: TMockMethod;
  lArgs: TOpenArray;
begin
  lArgs := ConcatArrays([ArgsToArray([@AIID]), ArgsToArray(AArgs), ArgsToArray([AContextID])]);
  lCall := AddCall('GetInstance').WithParams(lArgs);
  Pointer(AInstance) := FindVarData(lCall.OutParams[0]).VPointer;
  Result := lCall.ReturnValue;
end;

Gördüğünüz gibi benim çözümün kalbi inşa etmekti benim kendi array of TVarRec(aka TOpenArray) Sonra geçmek hangi WithParamskullanılan yöntem. Bana tek bir yeni diziye açık dizi argümanlarla açık argümanlar birleştirmek için izin yarar rutinleri bir çift yazdı.

İşte uygulanmasıdır ConcatArrays:

type TOpenArray = array of TVarRec;

function ConcatArrays(const AArrays: array of TOpenArray): TOpenArray;
var
  lLength: Integer;
  lArray: TOpenArray;
  lIdx: Integer;
  lElem: TVarRec;
begin
  lLength := 0;
  for lArray in AArrays do
    Inc(lLength, Length(lArray));
  SetLength(Result, lLength);
  lIdx := -1;
  for lArray in AArrays do
    for lElem in lArray do
      begin
        Inc(lIdx);
        Result[lIdx] := lElem;
      end;
end;

Bunları rutinleri muhtemelen kitlesel Delphi dahili dinamik ve açık diziler nasıl işleyeceğini daha derin bir anlayış olan birisi tarafından optimize edilebileceğini kuvvetli şüphe var.

Neyse, test sahasında yerde bu çözüm ile şimdi bile alay yöntemde açık dizi parametre olduğu gerçeğini göz ardı etmek gerekir. Ben sadece gibi beklenti belirtin:

FMock.Expects('GetInstance').WithParams([@IMyIntf, 1, 2, 3, lContextID]).ReturnsOutParam(lDummy).Returns(True);

... 1, 2, 3-bit gerçekten beklenen açık dizi argümandır.

Cevap 11/06/2010 saat 10:33
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more