2009-08-19 4 views
1

'ISomeInterface'인터페이스에서 확장 메서드를 테스트하고 있습니다. 확장 메서드는 실제로 인터페이스의 다른 메서드를 호출합니다.Rhino Mock에서 만든 모의 객체를 사용하여 해당 인터페이스의 다른 메소드를 호출하는 인터페이스에서 확장 메소드를 테스트하려면 어떻게합니까?

mock과 적절한 기대치를 설정하려면 어떻게해야합니까? ('SomeMethod'는 인터페이스에서 정의 된 메소드 인 다른 메소드가이 확장 메소드와 다르면 'someDifferentParam ')

// Extension Method 
public static ISomeInterface SomeMethod(this ISomeInterface someInterface, string someParam) 
{ 
    // do work, then call the defined method in the interface 
    someInterface.SomeMethod(int someDifferentParam) 

    return someInterface; 
} 


// tried to do the following but it errors 
[Test] 
public void SomeMethod_WithSomeInterface_CallsOtherSomeMethod() 
{ 
    const string someParam = "something"; 
    const int someOtherParam = 1; 

    var mock = MockRepository.GenerateMock<ISomeInterface>(); 

    mock.SomeMethod(someParam); 

    mock.AssertWasCalled(x => x.SomeMethod(someOtherParam)); 
} 

편집

나는 마침내 그것을 작업,하지만 난 제안/비판에 열려있어 얻었다. 방금 Rhino Mocks의 기능을 배우는 중입니다. =

여기가 제가 테스트 한 진짜 것입니다. Is.Equal 또는 Is.SameAs를 수행하여 두 개의 NHibernate.Criterion.Order 객체를 비교할 수 없으므로 public 속성이 없기 때문에 메서드 호출에 전달 된 인수를 캡처 한 다음 Order 객체의 ToString에 Assert해야했습니다. 그것에 노출.

// Extension Method 
public static class NHibernateExtensions 
{ 
    public static ICriteria AddOrder(this ICriteria criteria, params OrderBy[] orderBys) 
    { 
     foreach (var b in orderBys) 
     { 
      var arr = b.Property.Split(','); 
      for (var i = 0; i < arr.Length; i++) 
      { 
       criteria.AddOrder(b.Direction == OrderDirection.Ascending 
             ? Order.Asc(arr[i]) 
             : Order.Desc(arr[i])); 
      } 
     } 

     return criteria; 
    } 
} 


// here is the test that works 
[TestFixture] 
public class NHibernateExtensionsTester : TestBase 
{ 
    [Test] 
    public void AddOrder_1OrderBy_CallsAddOrderOnICriteriaWithCorrectOrder() 
    { 
     const string testProperty = "SomeProperty"; 
     var expected = (Order.Asc(testProperty)).ToString(); 

     var orderBys = new[] 
         { 
          new OrderBy 
          { 
           Direction = OrderDirection.Ascending, 
           Property = testProperty 
          } 
         }; 

     var mockCriteria = M<ICriteria>(); 

     mockCriteria.AddOrder(orderBys); 

     var orderArgument = (Order)((mockCriteria.GetArgumentsForCallsMadeOn(x => x.AddOrder(null)))[0][0]); 
     Assert.That(orderArgument.ToString(), Is.EqualTo(expected)); 
    } 
} 

답변

3

존 사실상 확장 방법을 테스트하고 있으므로 잘못된 점은 없습니다. 나는 당신의 코드를 밖으로 시도하고 나를 위해 잘 일했다. Here은 내가 실행 한 정확한 코드입니다 (xunit.net 및 TD.Net 사용). 테스트가 통과되었습니다.

어떤 오류가 발생합니까?

+0

내 문제는 테스트와는 다르지만 참조 유형이있는 경우 someOtherParam은 참조 유형 (위의 예와 같은 int가 아님)이라고 생각합니다. –

+0

내가 작동하도록 했으므로 논쟁을 당겨야했습니다. GetArgumentsForCallsMadeOn (x => x.SomeMethod (null)) –

관련 문제