gpt4 book ai didi

f# - 如何让 NUnit 运行未由模块导出的 F# 测试

转载 作者:行者123 更新时间:2023-12-04 11:42:58 24 4
gpt4 key购买 nike

我在 F# 中编写了一个大模块,它恰好有一个简单的接口(interface)。该模块包含大约 1000 行代码、50 个单元测试,并且只导出了一个易于理解的函数。

接下来要做的自然是编写一个很小的 ​​fsi 文件。这有很多优点,包括防止命名空间污染,为文档提供一个明显的位置,确保如果有人决定重用内部结构,他们将有动力将它们干净地分解出来,毫无疑问还有很多其他的。我确信我在这里向合唱团讲道,但仍然觉得值得解释为什么我觉得拥有 fsi 文件很有帮助。

现在的问题。 NUnit 将不再运行单元测试,顽固地声称它们不公开。好吧,那是因为它们无论如何都不是界面的一部分。尽管如此,我并不特别想将它们添加到界面中,因为这意味着每次我添加另一个测试时都会更新它,而且它会使 fsi 文件膨胀一个数量级。

我想一个简单的解决方法是将代码移动到其他地方,将其导入到一个小的 .fs 文件中,然后转发一个函数。运气好的话,每个人都会同意这简直令人反感。请问有没有更好的办法?

编辑:非常感谢所有回复的人。我赞成这两个答案。我本来想分割赏金,但是由于这似乎不可能,我会(有点武断地)接受托马斯的回答。

最佳答案

如果您要添加 fsi文件来指定源代码中模块和函数的可见性,那么您需要包含所有应该可以公开访问的函数的声明。这意味着如果 NUnit 要求测试是公共(public)函数,您需要将它们包含在 fsi 中。文件。

但是,还有另一种方法可以在 F# 中指定可见性 - 而不是使用 fsi文件,您可以在声明中添加适当的可见性修饰符。这样,您可以隐藏所有实现细节并仅导出主要功能和测试:

namespace MyLibrary
open NUnit.Framework

// Implementation details can be in this module
// (which will not be visible outside of the library)
module private Internal =
let foo n = n * 2
let bar n = n + 1

// A public module can contain the public API (and use internal implementation)
module public MyModule =
open Internal
let doWork n = foo (bar n)

// To make the tests visible to NUnit, these can be placed in a public module
// (but they can still access all functions from 'Internal')
module public Tests =
open MyModule

[<Test>]
let ``does work for n = 1``() =
Assert.Equals(doWork 1, 4)

与使用 fsi 相比文件,这有一个缺点,你没有一个单独的文件来很好地描述你的 API 的重要部分。然而,你会得到你需要的——隐藏实现细节并只公开一个函数和测试。

关于f# - 如何让 NUnit 运行未由模块导出的 F# 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8374837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com