Unit testing 如何在单元测试中使用具有.Net互操作性的相对路径?
系统:安装WSL Ubuntu 20.04的Windows 我有以下最小的c文件:Unit testing 如何在单元测试中使用具有.Net互操作性的相对路径?,unit-testing,.net-core,f#,Unit Testing,.net Core,F#,系统:安装WSL Ubuntu 20.04的Windows 我有以下最小的c文件: int one () { return 1; } 我编译时使用:test.c-shared-o test.out 然后我有一个X-Unit项目,其中包含以下文件: open System.Runtime.InteropServices module Interop = [<DllImport(@"../c_code/a.out", CallingConvention = Ca
int one () {
return 1;
}
我编译时使用:test.c-shared-o test.out
然后我有一个X-Unit项目,其中包含以下文件:
open System.Runtime.InteropServices
module Interop =
[<DllImport(@"../c_code/a.out", CallingConvention = CallingConvention.Cdecl)>]
extern int one()
module Program =
let [<EntryPoint>] main _ =
printf "Hello F# XUnit\n"
Interop.one () |> printfn "One: %A"
0
这给了我一个错误无法打开共享对象文件:没有这样的文件或目录
如果我将DllImport更改为]
,它会工作
我有没有办法用相对路径来代替?我想在以后使用github操作,所以我预计abslute路径会有问题
---背景---
我正在尝试使用.Net互操作性对我正在编写/更新的C库进行单元测试。该库是gnu89,不能升级到c99
我目前使用,但它不支持基于属性的测试。是c99,我在使用它方面没有太大的成功
因此,我想使用.net互操作性和FsCheck来运行我的测试。这与互操作几乎没有关系。运行单元测试时,可执行文件是测试运行程序,因此相对路径是相对于测试运行程序的。这是所有单元测试和工具的一个常见问题-例如,如何从本地文件夹加载测试数据?使用
@./c\u code/a.out“
也会在生产中失败。运行应用程序时,它会在父文件夹中查找a.out
,而父文件夹可能不存在。确保a.out
作为内容包含在项目中,并复制到输出中,并仅使用a.out
作为路径。这样,您的应用程序和测试运行程序都将在当前工作目录中查找库。好的,可以。这不是我想要的解决方案,但它是有意义的。如果你把它转换成一个答案,我会接受它。我从不相信当前的工作目录,因为一些测试过的代码,甚至你的工具,可能在你的开发过程中的某个时候会摆弄当前的工作目录。那么你的测试可能会失败。相反,找到一种可靠的方法来获取测试运行程序的路径,这与互操作几乎没有关系。运行单元测试时,可执行文件是测试运行程序,因此相对路径是相对于测试运行程序的。这是所有单元测试和工具的一个常见问题-例如,如何从本地文件夹加载测试数据?使用@./c\u code/a.out“
也会在生产中失败。运行应用程序时,它会在父文件夹中查找a.out
,而父文件夹可能不存在。确保a.out
作为内容包含在项目中,并复制到输出中,并仅使用a.out
作为路径。这样,您的应用程序和测试运行程序都将在当前工作目录中查找库。好的,可以。这不是我想要的解决方案,但它是有意义的。如果你把它转换成一个答案,我会接受它。我从不相信当前的工作目录,因为一些测试过的代码,甚至你的工具,可能在你的开发过程中的某个时候会摆弄当前的工作目录。那么你的测试可能会失败。相反,找到一种可靠的方法来获取测试运行程序的路径。
module Tests
open System
open Xunit
open System.Runtime.InteropServices
module Interop =
[<DllImport(@"../c_code/a.out", CallingConvention = CallingConvention.Cdecl)>]
extern int one()
[<Fact>]
let ``My test`` () =
let a = Interop.one()
Assert.True((a=1))