Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 初学者犀牛模拟题_.net_Rhino Mocks - Fatal编程技术网

.net 初学者犀牛模拟题

.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;

所以我是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 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语法的外观。