Unit testing 如何在单元测试中使用具有.Net互操作性的相对路径?

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

系统:安装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 = 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))