2015-01-13 3 views
0

가 어떻게조롱 다중 인터페이스 워스는

machine.fakes와
Substitute.For<DbSet<MyClass>, IQueryable<MyClass>, IDbAsyncEnumerable>() 

의 등가물을 얻을 수 machine.fakes? 제가

var myFake = An<DbSet<MyClass>>(); 
myFake.WhenToldTo(m => ((IQueryable<MyClass>)m).Provider).Return(whatever); 

를 사용하려하지만 다음 NotImplementedException 얻을 :

The member 'IQueryable.Provider' has not been implemented on type 'DbSet`1Proxy' which 
inherits from 'DbSet`1'. Test doubles for 'DbSet`1' must provide implementations of 
methods and properties that are used. 

같은 예외 myFake.WhenToldTo으로 제기 (m => ((에 IQueryable) m) .Provider) 뒷 덮개 (도대체 무엇이);

최소한의 코드로 문제를 재현하는 클래스입니다. 당신은

using System.Data.Entity; 
using System.Linq; 
using Machine.Fakes; 
using Machine.Specifications; 

namespace SpecsTests 
{ 
    public class TestClass 
    {} 

    [Subject("Test")] 
    internal class TestSpecifications 
    { 
     [Subject("Test")] 
     private class Test : WithFakes 
     { 
      private static int Count; 
      private static DbSet<TestClass> Subject; 

      private Establish context =() => 
             { 
              var data = new [] { new TestClass() }.AsQueryable(); 
              Subject = An<DbSet<TestClass>>(); 

              Subject.WhenToldTo(m => ((IQueryable)m).Provider).Return(data.Provider); 
             }; 

      private Because of =() => { Count = Subject.Count(); }; 

      private It Should_return_expected_results =() => 
                 { 
                  Count.ShouldEqual(1); 
                 }; 

     } 
    } 
} 
+0

나는 (캐스트없이) 코드를 얻을 수 있습니다. 그래서 그 문제는 다른 곳에 있어야합니다. 나머지 코드 나 가장 간단한 예제를 보여줄 수 있습니까? –

+0

문제 설명이 개선되었습니다. "캐스트가 없다"는 것은 무엇을 의미합니까? 람다에서 IQueryable로 캐스팅하지 않으면 컴파일 오류가 발생합니다 (cacnnot은 IQueryable.Provider의 명시 적 구현에 액세스 함) –

+0

코드가 실행되지 않아서 컴퓨터에서 코드 조각을 분석 할 수 없으므로 문제를 분석 할 수 없습니다. DbSet의 전체 사양 및 선언을 제공해주십시오. –

답변

0

는 방법은 없습니다 엔티티 프레임 워크, Machine.Specifications, Machie.Specifications.Should, Machine.Fakes, Machine.Fakes.NSubstitute, NSubstitute (또는 다른 모의 프레임 워크 플러그인)에 대한 패키지를 추가해야 하나의 인터페이스를 하나의 가상 머신에서 Machine.Fakes와 가짜로 만드는 것 - NSubstitute의 Substitute.For<>()과 동일합니다. 두 가지 옵션이 있습니다.

  1. NS substitute를 직접 사용하십시오.
    당신은 항상
    Subject = Substitute.For<DbSet<TestClass>, IQueryable<TestClass>>();
    대신
    Subject = An<DbSet<TestClass>>();
    단점은 당신이 기본 조롱 프레임 워크에서 독립과 Machine.Fake의 automocking 기능

  2. 재구성 가짜 코드를 포기한다는 것이다을 할 수있는 단 하나의 한 번에 인터페이스. 이것은 내가 선호하는 옵션 일 것이다.
    첫 번째 시도는 DbSet<> 대신 IDbSet<>을 가짜로 만들고이 인터페이스에만 적용됩니다. 그러나 나는 더 자세한 힌트를 얻기 위해 당신이 성취하려는 것을 너무 적게 알고 있습니다. 일반적으로 인터페이스에 의존하려고 항상 노력해야합니다. 어쩌면 테스트중인 클래스를 콘크리트와 독립적으로 만들 수 있습니다 DbSet<>?

+0

NSubstitute를 직접 사용하고 있습니다. –

+0

Iterable 과 IDbAsyncEnumerable의 파생 인터페이스를 모두 조롱하여 IDbSet 인터페이스를 조롱해야합니다. 이러한 방법을 별도로 조롱하는 방법이 없다고 생각합니다. 그러나 다중 상속은 .NET 기능이기 때문에 컴퓨터에서 기능을 가져야합니다.만약 automocking을위한 유틸리티가 아니라 조롱 프레임 워크에 대한 추상화 인 것처럼 가장한다면 fake. –

+1

귀하의 피드백에 감사드립니다. 하나의 가짜 인터페이스에서 여러 개의 인터페이스를 가짜로 처음 보게됩니다. 여러 조롱 프레임 워크가이를 지원하면 Machine.Fakes에서 확실하게 구현할 수 있습니다. 나는 풀 요청을 받아 들인다. :-) –