2017-10-15 18 views
3

저는 나를위한 속성을 만들 일부 도우미를 작성하여 EF를 단위 테스트에 쉽게 적용하려고합니다. 나는 백업 필드일반 반환 유형이있는 유형 전환

private Mock<DbSet<Workflow>> mockedWorkFlows; 
private Mock<DbSet<WorkflowError>> mockedWorkFlowErrors; 

의 몇 가지있다 그리고 나는 일반적인 기능은 다음과 같은 기능을 나에게 올바른 백업 필드를 반환 할 수 있도록하려면

public Mock<DbSet<T>> Mocked<T>(T t) where T : class 
{ 
    if ((object)t is Workflow) 
    { 
     return mockedWorkFlows; //cannot Workflow to T 
    } 
} 

내가 원하는 여러 개인 백업 필드가 있습니다 전달 된 유형을 기반으로 리턴됩니다.

그러나 클래스 제약 조건 인 Workflow을 추가하더라도 동일한 오류가 발생합니다.

나는 또한 t's 유형을 켜 봤지만 거기에는 행운이 없었습니다. 여러 백업 필드의 유형은 객체가 아닌 공통 조상을 공유하지 않습니다. 내가 할 수있는 일이 가능한거야?

+0

이 방법의 요점은 무엇인지 알지 못합니다. 가짜를 만드는 것은 1 줄의 코드를 필요로합니다. 가짜를 설정하고 싶다면 모든 가짜를 개별적으로 설정해야합니다. 따라서 특정 유형의 가짜에 대한 팩토리를 만들면 어떨까요? – FCin

+0

EF 컨텍스트에서 IDbSet 을 조롱하는 것은 한 줄 이상의 코드입니다. 데이터 할당을위한 유창한 인터페이스를 가지고 있지만 실제로 스파이로 불려지므로 백업 필드를 어딘가에 노출해야합니다. 난 단지 Context의 모든 IDbSet 속성에 대해 WorkflowsMocked, WorkflowErrorsMocked 등을 갖는 대신에 더 작은 API를 원한다. – wootscootinboogie

+0

'DbSet'을 조롱하는 대신에, 예를 들어, Effort 프레임 워크를 사용하여'SqlConnection'을 조롱하는 것을 고려해 보셨습니까? https://github.com/tamasflamich/effort –

답변

6

내가 제대로 당신의 의도를 이해한다면 - 당신은 이런 식으로 작업을 수행 할 수 있습니다

그것은 좋은 생각인지 여부
// no need to pass instance of T - why? 
public Mock<DbSet<T>> Mocked<T>() where T : class 
{ 
    if (typeof(T) == typeof(Workflow)) { 
     // first cast to object, then to return type to avoid compile error 
     // compiler does not know mockedWorkFlows is Mock<DbSet<T>>, but you 
     // know it already, because you checked type 'T' 
     return (Mock<DbSet<T>>) (object) mockedWorkFlows; //cannot Workflow to T 
    } 
    // etc 
    return null; 
} 

다른 이야기입니다. 심각하게 when 경비와 관련이없는 값에 전환하고 var 패턴을 사용하여 당신이 원하는 것을 달성하기 위해 C# 7의 switch을 남용 할 수

+0

이것은 내가 찾고있는 것입니다. 나는 C# 7 용 스위치의 매끄러운 모습을 사용하려고했지만 궁극적으로 내가 찾고 있던 것이 었습니다 (지금은 다른 오류가 발생했습니다! :)) – wootscootinboogie

1

:

public Mock<DbSet<T>> Mocked<T>() where T : class 
{ 
    switch(true) 
    { 
     case var _ when typeof(T) == typeof(Workflow): 
      return ... 
     case var _ when typeof(T) == typeof(WorkflowError): 
      return ... 
     default: 
      return null; 
    } 
} 

하지만 정말 끔찍한 코드, 그래서 제발 돈 이러지 마!

switch 문의 유형을 일치시킬 수 있다는 것은 매우 일반적인 요청입니다. github의 공식 언어 저장소에 대한 C#의 개선 제안이 있습니다 (Proposal: switch on System.Type 및 p Proposal: Pattern match via generic constraint 참조). 더 많은 패턴 매칭 기능이 C# (currently, set for "a 7.X release")에 추가 될 때마다이 기능에 대한 더 멋진 구문을 얻을 수 있습니다.