我现在正在设计一些代码,当一个字符串参数为null或空时,我会抛出一个异常。异常已经被正确地抛出了,但是在进行单元测试时却无法捕获。
这是我使用的客户端。
public class PipeClient : IPipeClient
{
public async void Send(string host, string pipeName, Message msg)
{
if (string.IsNullOrEmpty(msg.PreparedMessage))
throw new ArgumentException("MESSAGE_NOT_FOUND");
if (string.IsNullOrEmpty(host) || string.IsNullOrEmpty(pipeName))
throw new ArgumentNullException();
if (!host.TryParseHost())
throw new ArgumentException("INVALID_HOST_NAME");
using (var pipeClient = new NamedPipeClientStream(host, pipeName, PipeDirection.Out))
{
pipeClient.Connect(200);
using (var writer = new StreamWriter(pipeClient))
{
await Task.Run(() => writer.WriteLine(msg.PreparedMessage));
writer.Flush();
}
}
}
}
这里是单元测试(Unit Test)的代码:
[TestMethod]
public void Send_FailsOnWrongHostName()
{
var name = "FailWithHostname";
var msg = new Message(MyStates.Register, "UnitTest", "Test");
try
{
var client = new PipeClient();
client.Send("lol", name, msg);
}
catch (Exception e)
{
Assert.IsTrue(e is ArgumentException);
}
}
据我所知,运行该测试时,当我调用Send方法时会抛出异常,然后在catch子句中被捕获,因为我没有在PipeClient内捕获它。但事实并非如此,它只是以测试失败的状态退出。
如果您需要更多信息,请告诉我,提前感谢您。
[TestMethod]
上方添加[ExpectedException(typeof(ArgumentException))]
的注释即可。 - IronAces