【问题标题】:Mocked method returning null when called from a different project从不同项目调用时返回 null 的模拟方法
【发布时间】:2019-11-20 00:47:42
【问题描述】:

我有这个测试类:

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

【问题讨论】:

  • ICompanyBL 的自定义模拟应该可以解决这个问题,因为它不像 NSubstitute 那样基于传递参数的类型

标签: c# unit-testing nunit nsubstitute


【解决方案1】:

我不确定 nsubstitute 是如何工作的,但我相信您遇到了匿名类型仅在单个程序集中匹配的问题,它们在程序集中总是不同的。

您大概是在模拟companyBL.GetCompany&lt;TestAssembly.AnonymousTypeForRegionID&gt;,而您的测试代码调用companyBL.GetCompany&lt;ProductAssembly.AnonymousTypeForRegionID&gt;

最简单的解决方法 - 使用某种类型来传递这两个程序集之间共享的数据。即使Tuple 也可以。更多想法Return/consume dynamic anonymous type across assembly boundaries

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2018-04-27
    • 2020-01-21
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    相关资源
    最近更新 更多