有没有办法让来自不同平台的 Xamarin 单元测试运行器使用来自 PCL 的相同测试?

Is there a way to have Xamarin unit test runners from different platforms use the same tests from a PCL?

假设我有一个跨平台移动应用程序。它是 Xamarin 框架中的 built,其架构如下所示(有些简化):

共享层包含所有业务逻辑,另外两个项目包含平台特定 ui 实现 e.t.c。

我想使用单元测试来测试共享层。为此,我为 OS' 添加了两个测试 运行ners,就像 iOS 的 this one 一样。 运行测试人员都使用 NUnit 框架。

单元测试在单独的 PCL 中,它也使用 NUnit。

现在我的问题是:有没有办法让 运行 两个人都使用这个 PCL 的测试,以便将测试保存在一个地方?

我在网上看了一段时间,但没有找到太多相关信息。

下面我试图说明我要实现的目标:

来自共享项目的 class 包含需要测试的逻辑:

public class Logic
{
    // The method to test
    public int add(foo, bar)
    {
        return (foo + bar);
    }
}

包含测试的PCL:

[TestFixture]
public class SharedTest
{
    public void RunAll()
    {
        // Some magic code that runs all the below tests..
    }

    [Test]
    Add() {
        logic = new Logic();
        Assert.AreEqual(logic.add(1, 1), 2);
    }
}

iOS运行那class:

[TestFixture]
public class LogicTest
{
    SharedTest st = new SharedTest();

    [Test]
    st.RunAll();
}

旁注:我知道可以 运行 来自 PCL 的测试并在必要时模拟一些特定于平台的功能,但我的老板更喜欢在没有嘲笑的情况下使用 运行ners。

这个问题的目的只是想知道是否可以在没有两组相同测试的情况下使用特定于平台的 运行 用户。

此外,如果您有不同的方式,我愿意接受。

提前致谢!

我不确定我是否正确理解了您的计划,但让我试一试。

首先:可移植 Class 您想用来托管测试的库不能引用共享项目。换句话说:您不能在 PCL 内测试您的逻辑 class。这是一个盲目的结局。

第二:你写的都是你想测试的业务逻辑。如果该业务逻辑未耦合到 UI,否则这将远非理想,您可以轻松地将其放入 PCL 和 运行 您的任何测试 - 运行纳尔你会喜欢。您不必 运行 它在您正在构建的平台上,因为它 可移植

最简单、最灵活的方法是添加功能齐全的 .NET/Mono class 库项目、引用 nunit 和您的业务逻辑-PCL-项目,以及运行 使用您的 IDE 测试 运行ner 的测试(Xamarin Studio 或 Visual Studio,无关紧要)。

如果您确实需要一些特定于平台的东西或您绑定的 PCL 配置文件不支持的东西,您可以轻松地注入它。

假设您想对时区执行某些操作,而 PCL 不支持时区。在您的 PCL 中添加一个 ITimeZone 接口,在您的 Android 和 iOS 应用程序 共享项目中实现它,并将实现注入 运行时间进入你的逻辑(手工或任何你喜欢的库,我建议 ninject)。

经过进一步的研究,这是可能的,但我发现了一种更简单的方法,具有更多优势。我最初的问题(不想在两个地方使用相同的代码)的解决方案是使用共享项目。然后你可以在运行器项目中引用它,你的所有测试都会在那里显示。

使用它的另一个好处是您还可以使用编译器指令(#if __IOS__ 的#if __ANDROID__)将需要某些平台特定功能的代码放入其中:

#if __IOS__
using IOSApp;
#endif

#if __ANDROID__
using AndroidApp;
#endif

有关共享项目的信息可在此处找到:Xamarin shared projects guide