2009-01-08 51 views
1

所以我是新来的犀牛制品和我想要得到它打算在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 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"); 
} 

,但我一直在DoStuff方法中获得(在期望建立)一个空引用异常,因为视图对象为null。这就是我卡住的地方。我已经调用了Init方法,该方法分配了View属性的值,并且我认为期望设置的要点是该方法本身没有被调用过?

回答

2

您需要模拟View属性为好,而不是呼吁嘲笑主持人Init方法。

presenter.Expect(p => p.View).Return(view); 

你也可能想看看使用RhinoMocks新AAA(排列,法,断言)语法。

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,你应该大概只有模拟/存根认为不是主持人同意。我将保留原始更正以使您的代码正常工作,但更新我的示例以反映后者。

+0

你在测试什么? – Gutzofter 2009-01-08 10:02:06

0

从我看到你的源代码,你的测试是很难看到你其实是想测试一下。风景?演示者?

既然你有你的观点和接口的类中实现你的演讲,我想你想嘲笑查看和测试演示。

下面是组网站(我张贴的链接,这个问题就可以了你):

http://groups.google.com/group/RhinoMocks

看到这个代码。它是从2007年开始的,但它可以让你了解嘲笑的主旨。

http://tech.groups.yahoo.com/group/AgileEmbedded/files/HomeGuard/

8

看起来你正在测试犀牛制品。 你在嘲笑观点和主持人。 我假设嘲笑演讲者不是想要的,你应该嘲笑观点。

0

正如其他人写的,你需要决定你想测试,只有嘲笑其他的东西是什么代码。如果您正在尝试测试演示者,那么您只需要在使用真实演示者的同时模拟/取消视图。类似这样的:

[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()方法是否正确使用该视图。

希望这会有所帮助。