C#Nunit错误-MVP体系结构
我正在尝试为一个使用MVP架构的示例项目编写一个单元测试。 运行测试时,出现以下错误消息: UnitTests.Tests.testCopy:C#Nunit错误-MVP体系结构,c#,unit-testing,mocking,tdd,nunit,C#,Unit Testing,Mocking,Tdd,Nunit,我正在尝试为一个使用MVP架构的示例项目编写一个单元测试。 运行测试时,出现以下错误消息: UnitTests.Tests.testCopy: 预期:“测试…” 但是是:空 我在下面发布了我所做的片段: namespace Copy { public interface IView { string Copy { get; set; } string Original { get; } event EventHandler Chan
预期:“测试…”
但是是:空 我在下面发布了我所做的片段:
namespace Copy
{
public interface IView
{
string Copy { get; set; }
string Original { get; }
event EventHandler Changed;
}
public class Presenter
{
private IView view;
public Presenter(IView view)
{
this.view = view;
this.view.Changed += new EventHandler(OnChanged);
}
public void OnChanged(object sender, EventArgs e)
{
view.Copy = view.Original;
}
}
public partial class Form1 : Form, IView
{
private Presenter presenter;
public Form1()
{
InitializeComponent();
presenter = new Presenter(thisIView);
this.t_originalviewMock.TextChanged += OnChanged;
}
public string Original
{
get { return t_originalMockInstance).Text; }
}
public string Copy
{
get { return t_copy.Text; }
set { t_copy.Text = value;}
}
private void OnChanged(object sender, EventArgs e)
{
if (Changed != null)
Changed(sender, e);
}
public event EventHandler Changed;
}
}
单元测试代码:
namespace UnitTests
{
[TestFixture]
public class Tests
{
private DynamicMock viewMock;
private Presenter presenter;
[SetUp]
public void setup()
{
viewMock = new DynamicMock(typeof(IView));
presenter = new Presenter((IView)viewMock.MockInstance);
}
[Test]
public void testCopy()
{
viewMock.ExpectAndReturn("get_Original", "Testing ...");
viewMock.Expect("get_Cpoy");
Assert.AreEqual("Testing ...",
((IView)viewMock.MockInstance).Copy);
}
}
}
感谢您的帮助。“我正在测试原始文本框中的更改是否会导致复制文本框中的更改。” 下面是您应该如何设置测试:
已更改的事件
get_Original
property getter时,告诉view mock返回“Testing…”
Copy
setter并使用“Testing…”
值set\u Copy
预期值更改为“Testing…”以外的值,此测试就可以正常工作。
-它将失败并显示相应的消息
模拟框架旁注
你使用NUnit.mock而不是更严肃的mock框架的原因是什么?给,或者看一眼
如果您使用Fakeetisy,您的测试可能会是这样的:
[Test]
public void WhenViewChangedEventIsRaised_PresenterSetsCopyProperty()
{
var viewMock = A.Fake<IView>();
var presenter = new Presenter(viewMock);
A.CallTo(() => viewMock.Original).Returns("Testing ...");
viewMock.Changed += Raise.With(EventArgs.Empty).Now;
Assert.AreEqual(viewMock.Copy, "Testing ...");
}
[测试]
查看更改时的公共无效已被取消\u PresenterstCopyProperty()
{
var viewMock=A.Fake();
var presenter=新的presenter(viewMock);
A.CallTo(()=>viewMock.Original).返回(“测试…”);
viewMock.Changed+=Raise.With(EventArgs.Empty).Now;
AreEqual(viewMock.Copy,“测试…”);
}
请注意,键入
Cpoy
而不是Copy
之类的问题会立即消失。更不用说,您不必在公共API中公开事件处理程序。我试图测试原始文本框中的更改是否会导致复制文本框中的更改。如果我尝试以下方法:[Test]public void testCopy(){viewMock.ExpectAndReturn(“get_Original”,“Testing…”);viewMock.ExpectAndReturn(“get_Copy”,“Error…”);}测试不会失败。@davidhale:是的,我知道你现在想做什么了。看我的编辑2。就这样。谢谢你的帮助。我还要看一看假货和犀牛肉。@davidhale:不客气。我已经更新了Fakeitesy测试示例-您可以检查它“听起来”比Nunitmock更自然。更不用说,您可以将Presenter事件处理程序保持为私有。祝你好运
[Test]
public void WhenViewChangedEventIsRaised_PresenterSetsCopyProperty()
{
var viewMock = A.Fake<IView>();
var presenter = new Presenter(viewMock);
A.CallTo(() => viewMock.Original).Returns("Testing ...");
viewMock.Changed += Raise.With(EventArgs.Empty).Now;
Assert.AreEqual(viewMock.Copy, "Testing ...");
}