Pose 1.2.1

dotnet add package Pose --version 1.2.1                
NuGet\Install-Package Pose -Version 1.2.1                
此命令旨在在 Visual Studio 的包管理器控制台中使用,因为它使用 NuGet 模块的 Install-Package 版本。
<PackageReference Include="Pose" Version="1.2.1" />                
对于支持 PackageReference 的项目,请将此 XML 节点复制到项目文件中以便引用包。
paket add Pose --version 1.2.1                
#r "nuget: Pose, 1.2.1"                
#r 指令可用于 F# Interactive 和 Polyglot Notebooks。将此内容复制到交互工具或脚本的源代码中,以便引用包。
// Install Pose as a Cake Addin
#addin nuget:?package=Pose&version=1.2.1

// Install Pose as a Cake Tool
#tool nuget:?package=Pose&version=1.2.1                

Windows build status License: MIT NuGet version

Pose

Pose 允许您用委托替换任何 .NET 方法(包括静态和非虚拟方法)。它与 Microsoft Fakes 类似,但与它不同,Pose 完全是用托管代码(Reflection Emit API)实现的。所有操作都在运行时和内存中发生,没有非托管分析 API,也没有通过重写程序集来污染文件系统。

Pose 是跨平台的,可在任何支持 .NET 的地方运行。它针对 .NET Standard 2.0,因此可以在包括 .NET Framework、.NET Core、Mono 和 Xamarin 在内的 .NET 平台上使用。有关版本兼容性表,请参阅此处

安装

NuGet 可用

Visual Studio

PM> Install-Package Pose

.NET Core CLI

dotnet add package Pose

用法

Pose 允许您通过 Shim 类创建 shims。Shim 是基本对象,可以指定要替换的方法以及替换的委托。委托签名(参数和返回类型)必须与它们要替换的方法相匹配。Is 类用于创建类型的实例,所有要应用 shims 的代码都使用 PoseContext 类进行隔离。

静态方法 Shim

using Pose;

Shim consoleShim = Shim.Replace(() => Console.WriteLine(Is.A<string>())).With(
    delegate (string s) { Console.WriteLine("Hijacked: {0}", s); });

静态属性获取器 Shim

using Pose;

Shim dateTimeShim = Shim.Replace(() => DateTime.Now).With(() => new DateTime(2004, 4, 4));

静态属性设置器 Shim

using Pose;

Shim setterShim = Shim.Replace(() => Console.Title, true).With((string title) => { Console.Title = "My Title"; });

实例属性获取器 Shim

using Pose;

class MyClass
{
    public int MyProperty { get; set; }
    public void DoSomething() => Console.WriteLine("doing someting");
}

Shim classPropShim = Shim.Replace(() => Is.A<MyClass>().MyProperty).With((MyClass @this) => 100);

实例属性设置器 Shim

using Pose;

Shim classPropShim = Shim.Replace(() => Is.A<MyClass>().MyProperty, true).With((MyClass @this, int prop) => { @this.MyProperty = prop * 10; });

构造函数 Shim

using Pose;

Shim ctorShim = Shim.Replace(() => new MyClass()).With(() => new MyClass() { MyProperty = 10 });

引用类型的实例方法 Shim

using Pose;

Shim classShim = Shim.Replace(() => Is.A<MyClass>().DoSomething()).With(
    delegate (MyClass @this) { Console.WriteLine("doing someting else"); });

备注:实例方法替换委托的第一个参数总是类的实例

引用类型特定实例的Shim方法

using Pose;

MyClass myClass = new MyClass();
Shim myClassShim = Shim.Replace(() => myClass.DoSomething()).With(
    delegate (MyClass @this) { Console.WriteLine("doing someting else with myClass"); });

值类型Shim实例方法

using Pose;

Shim structShim = Shim.Replace(() => Is.A<MyStruct>().DoSomething()).With(
    delegate (ref MyStruct @this) { Console.WriteLine("doing someting else"); });

注意:您无法在值类型的特定实例上Shim方法

隔离您的代码

// This block executes immediately
PoseContext.Isolate(() =>
{
    // All code that executes within this block
    // is isolated and shimmed methods are replaced

    // Outputs "Hijacked: Hello World!"
    Console.WriteLine("Hello World!");

    // Outputs "4/4/04 12:00:00 AM"
    Console.WriteLine(DateTime.Now);

    // Outputs "doing someting else"
    new MyClass().DoSomething();

    // Outputs "doing someting else with myClass"
    myClass.DoSomething();

}, consoleShim, dateTimeShim, classPropShim, classShim, myClassShim, structShim);

注意事项与限制

  • 断点 - 目前,在隔离代码及其执行路径的任何地方设置的断点都不会被触发。但是,在Shim替代委托中设置的断点会被触发。
  • 异常 - 目前,在隔离代码及其执行路径中抛出的所有未处理的异常都始终封装在 System.Reflection.TargetInvocationException

路线图

  • 性能改进 - Pose可以在单元测试以外的上下文中使用。更好的性能会使它适合在生成代码中使用,可能用于覆盖旧功能。
  • 异常堆栈跟踪 - 目前,当在隔离的代码中抛出异常时,提供的异常堆栈跟踪相当混乱。需要提供一个未稀释的异常堆栈跟踪。

问题与贡献

如果发现问题或功能请求,请在 repository 的问题部分报告它们。贡献非常欢迎,但对于非常小的更改,请先提交一个问题,并在您打开 pull request 之前让我们进行讨论。

许可

此项目受MIT许可证授权。有关更多信息,请参阅LICENSE文件。

产品 兼容和附加计算目标框架版本。
.NET net5.0 已计算。 net5.0-windows 已计算。 net6.0 已计算。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。
.NET Core netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。
.NET Standard netstandard2.0 兼容。 netstandard2.1 已计算。
.NET Framework net461 已计算。 net462 已计算。 net463 已计算。 net47 已计算。 net471 已计算。 net472 已计算。 net48 已计算。 net481 已计算。
MonoAndroid monoandroid 已计算。
MonoMac monomac 已计算。
MonoTouch monotouch 已计算。
Tizen tizen40 已计算。 tizen60 已计算。
Xamarin.iOS xamarinios 已计算。
Xamarin.Mac xamarinmac 已计算。
Xamarin.TVOS xamarintvos 已计算。
Xamarin.WatchOS xamarinwatchos 已计算。
兼容的目标框架
包含的目标框架(在包中包含)
了解有关 目标框架.NET Standard 的更多信息。

NuGet 包

该包不被任何 NuGet 包使用。

GitHub 仓库 (1)

显示依赖于 Pose 的最受欢迎的 GitHub 仓库(共 1 个)

仓库 星星数
toddams/RazorLight
基于 Microsoft 的 Razor 解析引擎的模板引擎,用于 .NET Core
版本 下载 最后更新
1.2.1 597,966 6/26/2018
1.2.0 2,607 1/8/2018
1.1.0 45,296 11/23/2017
1.0.1 9,644 10/18/2017
1.0.0 1,362 10/10/2017