c# - 从不同项目调用时返回 null 的模拟方法
问题描述
我有这个测试课:
using NSubstitute;
using NUnit.Framework;
using System;
using System.Linq.Expressions;
namespace MyTests
{
public class Tests
{
[Test]
public void Test()
{
var companyBL = Substitute.For<ICompanyBL>();
companyBL.GetCompany(c => new { c.RegionID }).ReturnsForAnyArgs(new
{
RegionID = 4,
});
var company = companyBL.GetCompany(c => new { c.RegionID });
var dataRetriever = new DataRetriever(companyBL);
}
}
}
这个代码在另一个项目中:
namespace MyTests
{
using System;
using System.Linq.Expressions;
public interface ICompanyBL
{
T GetCompany<T>(Expression<Func<Company, T>> selector);
}
public partial class Company
{
public int RegionID { get; set; }
}
public class DataRetriever
{
public DataRetriever(ICompanyBL companyBL)
{
//This is null:
var company = companyBL.GetCompany(c => new
{
c.RegionID
});
}
}
}
变量company
是null
. 但是,当代码全部包含在同一个项目的同一个 .cs 文件中时,该值不是null
.
为什么null
在另一个项目的另一个文件中使用该值?
NSubstitute 版本 = 1.10.0.0。
.NET 框架版本 = 4.5.2。
在 Github 中提交的问题: https ://github.com/nsubstitute/NSubstitute/issues/598
解决方案
我不确定 nsubstitute 是如何工作的,但我相信您遇到了匿名类型仅在单个程序集中匹配的问题,它们在程序集中总是不同的。
大致上你是在嘲笑companyBL.GetCompany<TestAssembly.AnonymousTypeForRegionID>
和你测试过的代码调用companyBL.GetCompany<ProductAssembly.AnonymousTypeForRegionID>
。
最简单的解决方法 - 使用某种类型来传递这两个程序集之间共享的数据。甚至Tuple
会做。跨程序集边界返回/使用动态匿名类型中的更多想法
推荐阅读
- javascript - 合并函数内部的 RxJS 映射函数
- c++ - 使用 C++ 在 char 数组最后一个索引中添加值
- kotlin - 如何在 kotlin 中添加加载对话框
- java - 更新给定名称的联系人不起作用
- javascript - 无法让 javascript 在 codepen 演示中工作
- php - PHP 警告:array_key_exists() 期望参数 2 为数组
- firebase - 我可以在 Firebase 托管中获得一些测试网站的基本保护吗?
- r - 将对象传递给函数后,对象大小会增加
- python - 我对这个 pymongo 聚合查询做错了什么
- android - 单击按钮两次后显示 Toast