3

私にはまったく意味のない例外が発生しています。

3 つの引数を受け取るメソッドの Expect 呼び出しがあります。タイプは、CallContext、IDal、および List と呼ばれます。

NUnit は 2 つの例外をスローします。1 つは、タイプが CallContext、System.Object、および List である場合に発生したメソッド呼び出しを予期していないためであり、もう 1 つは、タイプが正しいものである場合に発生しなかった呼び出しを予期した場合です。おもしろいことに、メソッドを呼び出す唯一の方法は、上記の 3 つのタイプを使用することです。オブジェクト型のメソッド呼び出しはありません!

コードは次のとおりです。

 private IDal mockDal;
 private CallContext mockContext;
 private IWorkbooksLogic mockWLogic;
 private ICommercialSpaceLogic mockCLogic;
 private CmWorkbook mockWorkbook;
 private IList<Workbook> mockList;
 private MockRepository mock;
private Random random;

 [SetUp]
 public void Setup() {
   mock = new MockRepository();
   random = new Random();
   this.mockDal = mock.StrictMock<IDal>() as IDal;
   this.mockContext = new CallContext();
   this.mockWLogic = mock.StrictMock<IWorkbooksLogic>() as IWorkbooksLogic;
   this.mockCLogic = mock.StrictMock<ICommercialSpaceLogic>() as ICommercialSpaceLogic;
   this.mockWorkbook = new CmWorkbook();
   this.mockList = mock.StrictMock<IList<Workbook>>() as IList<Workbook>;
 }

[Test]
public void ShouldFailWhenCreateWorkbookFails() {

  int randBudget = random.Next(50);
  int randEntity = random.Next(50);
  int randWork = random.Next(50);

  WorkbookDefinitions work = new WorkbookDefinitions {
    WorkbookDefinitionID = randWork
  };

  Budget budget = new Budget {
    BudgetID = randBudget,
    WorkbookDefinitions = new List<WorkbookDefinitions> { work },       
  };

  CommercialProperty property = new CommercialProperty {
    CommercialPropertyID = randEntity,
    CMEntity = new CMEntity { 
      EntityBase = new EntityEntity { EntityCode = "random.Next(50)" }
    }
  };

  CmWorkbook book = new CmWorkbook {
    WorkbookName = String.Format("CM — {0}", property.CMEntity.EntityBase.EntityCode)
  };

  OperationResults results = new OperationResults();
  this.mockList.Add(book);
  using (mock.Record()) {
    Expect.On(this.mockDal).Call(this.mockDal.GetObject<Budget, int>(randBudget)).Return(budget);
    Expect.On(this.mockDal).Call(this.mockDal.GetObject<CommercialProperty, int>(randEntity)).Return(property);
    Expect.On(this.mockWLogic).Call(this.mockWLogic.Create(this.mockContext, this.mockDal, this.mockList)).Return(null);
  }
  using (mock.Playback()) {
    results = CmWorkbookLogic.CreateWorkbook(mockContext, mockDal, mockWLogic, mockCLogic, randBudget, randEntity);
  }
  Assert.IsFalse(results.AllSuccessful);
}

呼び出されるメソッドは次のとおりです: workbooksLogic.Create(context, dal, new List { workbook }) NUnit エラーは次のとおりです。

ShouldFailWhenCreateWorkbookFails:
Rhino.Mocks.Exceptions.ExpectationViolationException : ICRUDBaseLogic`1.Create(CallContext, System.Object, System.Collections.Generic.List`1[Workbook]); Expected #0, Actual #1.
ICRUDBaseLogic`1.Create(CallContext, IDalProxy8768e63f86da4601993b4791c696ada6, System.Collections.Generic.List`1[Workbook]); Expected #1, Actual #0.

これで一体何が起こっているのかわかりません。誰にもアイデアはありますか?

4

1 に答える 1

4

Rhino Mocks は、オーバーロードされた Equals メソッドを使用して、予想される呼び出しと実際に発生した呼び出しの引数を比較します。引数として指定するオブジェクトの中には、Equals がオーバーロードされていないものがあります (つまり、List クラスで、他のオブジェクトについては不明です)。あなたが期待を設定するために使用したもの。

いくつかのオプションがあります:

  1. IgnoreArguments を使用して、引数がまったくチェックされないようにする
  2. Equals() を使用せずに、引数が期待どおりかどうかを確認できるように、独自の制約を指定します。
  3. これらがまったく同じオブジェクトであることを確認してください (可能な場合)
于 2010-07-14T16:36:30.890 に答える