이렇게 몇 가지 방법이 있다고 해봅시다.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 대리자를 전달할 것인지를 설정합니다. 미리 코드를 삽입하여 원하는대로 만들 수 있습니다. 값이 전달되는 것을 보아라. 메소드 호출의 수를 추적하기 위해 사전에 데이터를 추가 할 수있다.
이제는 더 이해하기를 바란다 ...
표현식 API가 어디에 제공되는지는 명확하지 않습니다. 메소드 서명을 지정했는데 그게 전부입니다. 'Func '을 일부 속성에 할당하는 것에 대해 이야기했지만 표현 API를 사용할 필요가 없습니다 ... 자세한 정보를 제공해주세요. –
@ 존 스 켈 : 편집을 참조하십시오. 더 많은 설명이 필요하면 알려주세요. – BFree