首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XUnit/FsUnit框架抛出“对象引用未设置为objct实例”

XUnit/FsUnit框架抛出“对象引用未设置为objct实例”
EN

Stack Overflow用户
提问于 2022-10-28 01:39:52
回答 1查看 27关注 0票数 0

我为我的代码编写了这个简单的测试用例。

代码语言:javascript
复制
module CustomerTests
open Xunit
open FsUnit
open MyProject.Customer
open MyProject.Customer.Domain
    
module ``When upgrading customer`` = 
  let customerVIP = {Id = 1; IsVip = true; Credit = 0.0M}
  let customerSTD = {Id = 2; IsVip = false; Credit = 100.0M}
  [<Fact>]
  let ``should give VIP customer more credit`` () =
    let expected = {customerVIP with Credit = customerVIP.Credit + 100.0M }
    let actual = upgradeCustomer customerVIP
    actual |> should equal expected

非常令人惊讶的是,这段代码出错了。

代码语言:javascript
复制
[xUnit.net 00:00:00.64] CustomerTests+When upgrading customer.should give VIP cstomer more credit [FAIL]
  Failed CustomerTests+When upgrading customer.should give VIP cstomer more credit [3 ms]
  Error Message:
  System.NullReferenceException : Object reference not set to an instance of an object.
  Stack Trace:
    at CustomerTests.When upgrading customer.should give VIP cstomer more credit() in /Users/user/code/fsharp/CustomerProject/CustomerTests.fs:line 12

但是第12行只是一个正在创建的记录,因此该行不可能抛出对象引用,而不是设置为对象实例。这完全让我费解。

dotnet fsi repl中,我可以执行我的所有方法,并且在我的函数中没有对象引用问题,这是从这里的测试中调用的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-28 02:23:04

正如this SO answer解释的那样,XUnit以跳过这些值初始化的方式加载测试。一个简单的解决方法是使用一个类而不是一个模块:

代码语言:javascript
复制
type ``When upgrading customer``() =

    let customerVIP = {Id = 1; isVip = true; Credit = 0.0M}
    let customerSTD = {Id = 2; isVip = false; Credit = 100.0M}

    [<Fact>]
    let ``should give VIP cstomer more credit`` () =
        let expected = {customerVIP with Credit = customerVIP.Credit + 100.0M }
        let actual = upgradeCustomer customerVIP
        actual |> should equal expected

这样,这些值的初始化就会按应有的方式进行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74229814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档