加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 23:33:10 所属栏目:百科 来源:网络整理
导读:关于Moq与MsTest的行为有点混淆. 编辑:这不是“如何测试?”的问题.或者“我如何断言?”,这是一个便于查看MoQ如何工作的便笺簿,因此不要关注异常类型等. 我认为一个更好的问题可能是= “Moq是否会抛出表现类似于MsTest ExpectedExceptionAttribute?”也就
关于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);
}

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

public long SaveCart(Cart cart )
{
    long returnValue;

    try
    {
        returnValue = _cartDatabase.SaveCart(cart);
    }
    catch (Exception)
    {
        return 0;
    }
    return returnValue;
}

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

public long SaveCart(Cart cart )
{
    long returnValue;

    try
    {
        returnValue = _cartDatabase.SaveCart(cart);
    }
    catch (Exception)
    {
        throw new ApplicationException();
    }
    return returnValue;
}

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

解决方法

你是对的 – 第二个测试“SaveCart”有效,因为它正在抛出一个异常并且第一个测试因为你正在转0而失败.从你对前面答案的回答,我相信你已经知道了这一切.如果你问的是第一次测试失败的行为……它是这样的:

>调用SaveCart
>它返回一个异常(你的moq设置的结果)
>你的尝试捕获了异常(你故意这样做是为了改变结果)
>您的try catch返回0(结果现在为0,因为您打算更改它)
>断言根据_cartSaveExceptionValue检查结果
>您得到一个失败测试,??声明类似于此消息:消息:Assert.AreEqual失败.预期.实际< 0(System.Int32)>.“

如果你想仔细检查这个…你可以尝试以下测试

>注释掉[ExpectedException(typeof())]
>将Assert.AreEqual(result,_cartSaveExceptionValue)更改为Assert.AreEqual(result,0);
>测试应该通过,因为您将“结果”(又名0)与0进行比较

我希望这能回答你的问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读