2011-08-05 4 views
0

이렇게 몇 가지 방법이 있다고 해봅시다.Expression API를 사용하면 Func <T>을 다른 것과 "결합"할 수 있습니까?

public void Method<T>(Func<T> func) 
{ 
... 
} 

Func API를 사용하고 Func에서 전달 된 코드가 실행되기 전에 효과적으로 실행할 수있는 방법이 있습니까? 의미, 내 방법에서, 나는 실제로 Func을 실행하지 않을 것이다. 오히려 나는 그것을 Func를 호출 할 객체의 속성으로 할당 할 것이다. 코드가 전달되기 전에 일부 코드를 실행하기 만하면됩니다. 또한 내 코드가 Func에서 "반환"할 수 있으므로 전달 된 코드는 실행되지 않습니다.

편집 : 좋아, 나는 충분하지 않다는 것이 두렵다. 여기 내가하려는 일이있다. Moles를 사용하면 코드에서 작성된 모든 호출을 생략 할 수 있습니다. 그렇다면 정적 메서드를 호출하는 테스트 할 수없는 코드가 있다고 가정 해 보겠습니다.

FileSystem.ReadAllText(string fileName); 

mole은 스텁/두더지 개체를 만듭니다 (용어가 무엇이든간에) 메서드를 스텁하는 데 사용할 수 있습니다. 내 코드가 ReadAllText를 호출하면 내 스텁이 호출됩니다.

그러나이 아이디어를 확장하려고 시도하고 있으므로 Moock과 같은 전형적인 Mocking 프레임 워크와 유사하게 사용할 수 있습니다. 그래서 전달 된 매개 변수가 특정 값일 때만 그 메서드를 스텁 (stub) 할 수 있습니다. 또는 메소드가 한 번만 호출되는 것을 확인하는 것이 가능할 수 있습니다. 여기에 내가 지금까지 가지고있는 것이 있습니다.

여전히 매우 매우 거친 !!

public class TestReader 
{ 
    public string Content { get; private set; } 

    public void LoadFile(string fileName) 
    { 
     var content = FileSystem.ReadAllText(fileName); 
     if (!content.StartsWith("test")) 
     { 
      throw new ArgumentException("invalid file"); 
     } 
     this.Content = content; 
    } 
} 

이제 다음과 같이 할 수 있습니다.

 [TestMethod] 
    [HostType("Moles")] 
    public void CheckValidFilewithMoles() 
    { 
     //arrange 
     var fileName = "test.txt"; 
     var content = "test"; 

     //act 
     var test = new TestReader(); 
     test.TestWithMoles<TestReader, string, string>(s => FileSystem.ReadAllText(s), s => 
                          { 
                           Assert.IsTrue(s == fileName); 
                           return content; 
                          }); 
     test.LoadFile(fileName); 
     //assert 
     Assert.AreEqual(content, test.Content); 
    } 

지금까지는 그렇게 좋았지 만 그렇지 않았습니다. 아직 아무것도 성취하지 못했다. 내가하고 싶은 내 확장 방법입니다.

   property.SetValue(item, stub, null); 

어떤 사람이 Maur 대리자를 전달할 것인지를 설정합니다. 미리 코드를 삽입하여 원하는대로 만들 수 있습니다. 값이 전달되는 것을 보아라. 메소드 호출의 수를 추적하기 위해 사전에 데이터를 추가 할 수있다.

이제는 더 이해하기를 바란다 ...

+2

표현식 API가 어디에 제공되는지는 명확하지 않습니다. 메소드 서명을 지정했는데 그게 전부입니다. 'Func '을 일부 속성에 할당하는 것에 대해 이야기했지만 표현 API를 사용할 필요가 없습니다 ... 자세한 정보를 제공해주세요. –

+0

@ 존 스 켈 : 편집을 참조하십시오. 더 많은 설명이 필요하면 알려주세요. – BFree

답변

3

왜 돈을 참조 그 물건을 부동산에 지정하기 전에 그냥 감쌌습니까?

Func<T> myProp =() => 
{ 
    //run your code here 
    return func(); 
} 
+0

하하하 overthinking ....에 대해 이야기 와우 .... – BFree

관련 문제