小编Sam*_*eeh的帖子

使用Moq和MSTest测试异常的正确方法

关于Moq与MsTest的行为有点混淆.

编辑:这不是"如何测试?"的问题.或者"我如何断言?",这是一个便于查看MoQ如何工作的便笺簿,因此不要关注异常类型等.

我认为一个更好的问题可能是=>"Moq投掷<>的行为是否与MsTest ExpectedExceptionAttribute相似?" 也就是说,他们期望在测试或SUT中出现异常?

我想知道当与MsTest一起使用时,MoQ"投掷"的工作原理.不使用MsTest预期的异常属性会更好吗?在测试中执行try..catch是否更好?我还有一些问题需要解决这个问题.

我正在模拟数据库调用,当发生错误时,我想返回零(0).

TestMethod直接使用MsTest异常属性,并且使用Moq抛出异常.它仅在我在SaveCart方法中抛出异常而不是在返回零时才起作用.

我想了解潜在的行为,因为它感觉好像我不应该,也不想在SaveCart方法中抛出异常.

这是测试中的测试:

[TestMethod]
[ExpectedException(typeof(ApplicationException))]
public void CartRepoSaveCartExceptionShouldReturnZero()
{
     _cartDatabaseMock.Setup(c => c.SaveCart(_cart))
                                   .Throws<ApplicationException>();

    var result = _cartRepository.SaveCart(_cart);

    Assert.AreEqual(result, _cartSaveExceptionValue);
}
Run Code Online (Sandbox Code Playgroud)

这是基本的SaveCart,它不会抛出导致测试失败的异常:

public long SaveCart(Cart cart )
{
    long returnValue;

    try
    {
        returnValue = _cartDatabase.SaveCart(cart);
    }
    catch (Exception)
    {
        return 0;
    }
    return returnValue;
}
Run Code Online (Sandbox Code Playgroud)

这是一个基本的SaveCart测试工作,因为它抛出异常:

public long SaveCart(Cart cart )
{
    long returnValue;

    try
    {
        returnValue = _cartDatabase.SaveCart(cart);
    }
    catch (Exception)
    {
        throw new ApplicationException();
    }
    return returnValue;
}
Run Code Online (Sandbox Code Playgroud)

如果问题没有明确解释,请随意为问题提出更好的标题.

.net c# unit-testing mstest moq

4
推荐指数
2
解决办法
8244
查看次数

标签 统计

.net ×1

c# ×1

moq ×1

mstest ×1

unit-testing ×1