我已閱讀this article,但在你的情況,我認爲做這樣的事是矯枉過正..
由於GetOwinContext()
返回一個接口的所有你所要做的就是這一呼籲從方法分離,做這樣的事有2個問題:
- 下試驗的方法(
OnActionExecuting()
由一個屬性類資
GetOwinContext()
是一個靜態方法
。個
最好的2種解決方案,我可以爲您提供的是:像MsFakes,Typemock隔離器和等
- 使用代碼揮舞工具,而不是像RhinoMocks基於代理的工具。
- 提取
GetOwinContext()
到虛擬方法,然後使用PartialMock技術(這種技術通常是在使用抽象類):
假設MyCustonAttributte
是你的屬性:
public class MyCustonAttributte : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
GetOwinContext().Set("RequestGUID", Guid.NewGuid());
base.OnActionExecuting(actionContext);
}
public virtual IOwinContext GetOwinContext()
{
return HttpContext.Current.GetOwinContext();
}
}
那麼你的UT將是:
[Test]
public void New_GUID_should_be_added_when_OnActionExecuting_is_executing()
{
//arrange section:
const string REQUEST_GUID_FIELD_NAME = "RequestGUID";
var owinContext = MockRepository.GenerateStub<IOwinContext>();
var target = MockRepository.GeneratePartialMock<MyCustonAttributte>();
target.Stub(x => x.GetOwinContext())
.Return(owinContext);
//act:
target.OnActionExecuting(new HttpActionContext());
//assert section:
owinContext.AssertWasCalled(x => x.Set(Arg<string>.Is.Equal(REQUEST_GUID_FIELD_NAME),
Arg<Guid>.Is.NotEqual(Guid.Empty)));
}
工程就像一個魅力。無論如何,GUID被添加到集合中是我唯一想要測試的東西......非常感謝。 – Eedoh