【发布时间】:2014-09-09 18:26:31
【问题描述】:
我有以下代码:
public FuzzyPickles(IPie pieMaker)
{
_pieMaker = pieMaker;
}
public string PieName
{
get
{
if (_pieName == null)
{
GetPieName();
}
return _pieName;
}
}
private async void GetPieName()
{
string asyncPieName = string.Empty;
try
{
var task = _pieMaker.GetDeliciousPieAsync();
asyncPieName = await task;
}
catch (RottenFruitException e)
{
Debug.Write(e.Message);
}
if (!string.IsNullOrEmpty(asyncPieName))
{
_pieName = asyncPieName;
NotifyPropertyChanged(PieName);
}
}
我想写一个测试(我正在使用 RhinoMocks)来验证那个 getter 中抛出的异常不会让我得到腐烂的水果馅饼:
[TestClass]
public class FuzzyTest
{
private FuzzyPickles _pickles;
private IPie _pieMocker;
[TestInitialize]
public void Setup()
{
_pieMocker = MockRepository.Mock<IPie>();
_pickles = new FuzzyPickles(_pieMocker);
}
[TestMethod]
public void PieName_WhenGettingException_ShouldHandleExceptionGracefully()
{
_pieMocker.Stub(x => x.GetDeliciousPieAsync()).Throws(new RottenFruitException());
var pieName = _pickles.PieName;
//What should I assert here ?
}
}
这是我真正的问题。
删除 try / catch 块不会将异常抛回 UT 运行器,因为我没有在 UT 中使用 await,因为它没有原型为异步任务并且 getter 不能是异步的,因此我不能等待或使用函数相反(或者我可以吗?)
那个 getter 绑定到 UI(即:我用它在我的 UI 中显示信息,所以我不知道什么时候 - 如果有的话 - 它会被调用),这就是为什么我要做这个丑陋的功能调用 hack,并在其中使用 NotifyPropertyChanged(这里不用担心跨线程异常,这不是重点)
我不想在 hacks 后面使用代码(Windows Phone 8.1 / Silverlight 项目)。
如果我删除 try / catch 块,我如何编写一个将失败的单元测试?我应该断言什么?
【问题讨论】:
标签: c# .net unit-testing windows-phone-8 async-await