.net 初学者犀牛模拟题
所以我是rhino mocks的新手,我正在努力让它在一个MVP模式的项目中运行。因此,我有一个表示我的视图的接口和一个用于演示者的类,如下所示:.net 初学者犀牛模拟题,.net,rhino-mocks,.net,Rhino Mocks,所以我是rhino mocks的新手,我正在努力让它在一个MVP模式的项目中运行。因此,我有一个表示我的视图的接口和一个用于演示者的类,如下所示: public interface IView { string SomeData { get; set; } } public class Presenter { public IView View { get; set; } public void Init(IView view) { this.View = view;
public interface IView {
string SomeData { get; set; }
}
public class Presenter {
public IView View { get; set; }
public void Init(IView view) {
this.View = view;
}
public virtual string DoStuff(){
return "Done stuff with " + this.View.SomeData;
}
}
我正试图建立一个模拟DoStuff方法的测试,所以我有一个基本的夹具,如下所示:
[TestMethod]
public void Test(){
var mocks = new MockRepository();
var view = mocks.Stub<IView>();
var presenter = mocks.StrictMock<Presenter>();
presenter.Init(view);
using(mocks.Record()){
presenter.Expect(p => p.DoStuff()).Return("Mocked result");
}
string result = string.Empty;
using(mocks.Playback()){
result = presenter.DoStuff();
}
Assert.AreEqual(result, "Mocked result");
}
[TestMethod]
public void Test(){
var view = MockRepository.GenerateStub<IView>();
var presenter = new Presenter();
presenter.Init(view);
view.SomeData = "Test";
Assert.AreEqual(presenter.DoStuff(), "Done stuff with Test");
}
但是在期望设置期间,我一直从DoStuff方法中获得一个null引用异常,因为View对象为null。这就是我被困的地方。我调用了Init方法,该方法分配View属性的值,我认为期望设置的要点是该方法本身从未被调用过?您也需要模拟View属性,而不是在模拟的presenter上调用Init方法
presenter.Expect( p => p.View ).Return( view );
您可能还希望了解如何为Rhinomock使用新的Arrange-Act-Assert语法
string expectedResult = "Done stuff with Mocked Result";
var view = MockRepository.GenerateMock<IView>();
view.Expect( v => v.SomeData ).Return( "Mocked Result" );
var presenter = new Presenter();
presenter.Init( view );
string actualResult = presenter.DoStuff();
Assert.AreEqual( expectedResult, actualResult );
view.VerifyAllExpectations();
再次查看后进行编辑,我同意@ayende的观点,即您应该只模拟/存根视图,而不是演示者。我将保留原始更正以使代码正常工作,但请更新我的示例以反映后者。您还需要模拟View属性,而不是在模拟的presenter上调用Init方法
presenter.Expect( p => p.View ).Return( view );
您可能还希望了解如何为Rhinomock使用新的Arrange-Act-Assert语法
string expectedResult = "Done stuff with Mocked Result";
var view = MockRepository.GenerateMock<IView>();
view.Expect( v => v.SomeData ).Return( "Mocked Result" );
var presenter = new Presenter();
presenter.Init( view );
string actualResult = presenter.DoStuff();
Assert.AreEqual( expectedResult, actualResult );
view.VerifyAllExpectations();
再次查看后进行编辑,我同意@ayende的观点,即您应该只模拟/存根视图,而不是演示者。为了让代码正常工作,我将保留最初的更正,但更新我的示例以反映后一种情况。从我对您的源代码和测试的了解来看,很难看出您实际要测试什么。风景?主持人 由于您的视图有一个接口,演示者有一个类实现,因此我认为您需要模拟视图并测试演示者
presenter.Expect( p => p.View ).Return( view );
这是我为您发布的该问题的链接:
请参阅此代码。这是从2007年开始的,但它可以让你了解嘲弄的要点
从我对源代码和测试的了解来看,很难看出您实际要测试什么。风景?主持人 由于您的视图有一个接口,演示者有一个类实现,因此我认为您需要模拟视图并测试演示者
presenter.Expect( p => p.View ).Return( view );
这是我为您发布的该问题的链接:
请参阅此代码。这是从2007年开始的,但它可以让你了解嘲弄的要点
看起来你在测试犀牛模型。 您正在模拟视图和演示者。
我假设模拟演示者是不可取的,您应该只模拟视图。看起来您正在测试Rhino模拟。 您正在模拟视图和演示者。
我将假设模拟演示者是不可取的,您应该只模拟视图。正如其他人所写,您需要决定要测试什么代码,并且只模拟其他内容。如果您试图测试演示者,那么您只想在仍然使用真实演示者的情况下模拟/剔除视图。大概是这样的:
[TestMethod]
public void Test(){
var mocks = new MockRepository();
var view = mocks.Stub<IView>();
var presenter = mocks.StrictMock<Presenter>();
presenter.Init(view);
using(mocks.Record()){
presenter.Expect(p => p.DoStuff()).Return("Mocked result");
}
string result = string.Empty;
using(mocks.Playback()){
result = presenter.DoStuff();
}
Assert.AreEqual(result, "Mocked result");
}
[TestMethod]
public void Test(){
var view = MockRepository.GenerateStub<IView>();
var presenter = new Presenter();
presenter.Init(view);
view.SomeData = "Test";
Assert.AreEqual(presenter.DoStuff(), "Done stuff with Test");
}
然后,您将测试Presenter.DoStuff方法是否正确使用视图
希望这能有所帮助。正如其他人所写,您需要决定要测试的代码,并且只模拟其他内容。如果您试图测试演示者,那么您只想在仍然使用真实演示者的情况下模拟/剔除视图。大概是这样的:
[TestMethod]
public void Test(){
var mocks = new MockRepository();
var view = mocks.Stub<IView>();
var presenter = mocks.StrictMock<Presenter>();
presenter.Init(view);
using(mocks.Record()){
presenter.Expect(p => p.DoStuff()).Return("Mocked result");
}
string result = string.Empty;
using(mocks.Playback()){
result = presenter.DoStuff();
}
Assert.AreEqual(result, "Mocked result");
}
[TestMethod]
public void Test(){
var view = MockRepository.GenerateStub<IView>();
var presenter = new Presenter();
presenter.Init(view);
view.SomeData = "Test";
Assert.AreEqual(presenter.DoStuff(), "Done stuff with Test");
}
然后,您将测试Presenter.DoStuff方法是否正确使用视图
希望这能有所帮助。他正在测试是否调用了View属性,是否也调用了DoStuff方法。这只是一些演示代码,看看AAA语法如何。他正在测试视图属性是否被调用,DoStuff方法是否也被调用。这只是一些演示代码,以了解AAA语法的外观。