m_c*_*ard 14 c# bdd unit-testing xunit fakeiteasy
我正在使用xUnit,SubSpec和FakeItEasy进行单元测试.到目前为止,我已经创建了一些积极的单元测试,如下所示:
"Given a Options presenter"
.Context(() =>
presenter = new OptionsPresenter(view,
A<IOptionsModel>.Ignored,
service));
"with the Initialize method called to retrieve the option values"
.Do(() =>
presenter.Initialize());
"expect the view not to be null"
.Observation(() =>
Assert.NotNull(view));
"expect the view AutoSave property to be true"
.Observation(() => Assert.True(view.AutoSave));
Run Code Online (Sandbox Code Playgroud)
但是现在我想写一些负面单元测试并检查某些方法是否被调用,并抛出异常
例如
"Given a Options presenter"
.Context(() =>
presenter = new OptionsPresenter(view,
A<IOptionsModel>.Ignored,
service));
"with the Save method called to save the option values"
.Do(() =>
presenter.Save());
"expect an ValidationException to be thrown"
.Observation(() =>
// TODO
);
"expect an service.SaveOptions method not to be called"
.Observation(() =>
// TODO
);
Run Code Online (Sandbox Code Playgroud)
我可以看到FakeItEasy有一个MustNotHaveHappened扩展方法,xUnit有一个Assert.Throws方法.
但是我怎么把它们放在一起呢?
我想要测试的异常应该在调用Save方法时发生.所以我猜我应该在presenter.Save()方法调用周围包装一个Assert.Throws方法,但我认为应该在.Do(()=>中调用presenter.Save方法...
您能否告知我的单元测试是否应该如下所示?
"Given a Options presenter"
.Context(() =>
presenter = new OptionsPresenter(view,
model,
service));
"expect the Presenter.Save call to throw an Exception"
.Observation(() =>
Assert.Throws<FluentValidation.ValidationException>(() => presenter.Save()));
"expect the Service.SaveOptions method not to be called"
.Observation(() =>
A.CallTo(() => service.SaveOptions(A<IOptionsModel>.Ignored)).MustNotHaveHappened());
Run Code Online (Sandbox Code Playgroud)
非常感谢
Ste*_*eve 11
我没有听说过fakeItEasy或subSpec(你的测试看起来非常时髦,所以我可能会检查这些:)).但是,我确实使用xUnit,所以这可能会有所帮助:
我在Assert.ThrowsDelegate中使用Record.Exception
所以类似于:
[Fact]
public void Test()
{
// Arange
// Act
Exception ex = Record.Exception(new Assert.ThrowsDelegate(() => { service.DoStuff(); }));
// Assert
Assert.IsType(typeof(<whatever exception type you are looking for>), ex);
Assert.Equal("<whatever message text you are looking for>", ex.Message);
}
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.
我会这样做:
"Given a Options presenter"
.Context(() =>
presenter = new OptionsPresenter(view,
(IOptionsModel)null,
service));
"with the Save method called to save the option values"
.Do(() =>
exception = Record.Exception(() => presenter.Save()));
"expect an ValidationException to be thrown"
.Observation(() =>
Assert.IsType<ValidationException>(exception)
);
"expect an service.SaveOptions method not to be called"
.Observation(() =>
A.CallTo(() => service.SaveOptions(A<IOptionsModel>.Ignored)).MustNotHaveHappened()
);
Run Code Online (Sandbox Code Playgroud)
或者更好的是,为xBehave.net切换SubSpec并引入FluentAssertions: -
"Given an options presenter"
.x(() => presenter = new OptionsPresenter(view, (IOptionsModel)null, service));
"When saving the options presenter"
.x(() => exception = Record.Exception(() => presenter.Save()));
"Then a validation exception is thrown"
.x(() => exception.Should().BeOfType<ValiationException>());
"And the options model must not be saved"
.x(() => A.CallTo(() =>
service.SaveOptions(A<IOptionsModel>.Ignored)).MustNotHaveHappened());
Run Code Online (Sandbox Code Playgroud)
这是在FakeItEasy中执行此操作的一种方法。
Action act = () => someObject.SomeMethod(someArgument);
act.ShouldThrow<Exception>();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9479 次 |
| 最近记录: |