Unit testing Moq,如何使用私有构造函数来Moq对象?

Unit testing Moq,如何使用私有构造函数来Moq对象?,unit-testing,testing,mocking,moq,Unit Testing,Testing,Mocking,Moq,我有这个类层次结构 public class Order { private Client _client; public virtual Client { get => _client; } private OrderNumber _orderNumber; public virtual OrderNumber OrderNumber { get => _orderNumber; } private ShippingDetails _

我有这个类层次结构

public class Order
{  
    private Client _client;
    public virtual Client { get => _client; }

    private OrderNumber _orderNumber;
    public virtual OrderNumber OrderNumber { get => _orderNumber; }

    private ShippingDetails _shippingDetails;
    public virtual ShippingDetails ShippingDetails { get => _shippingDetails; }

    private IList<Product> _products;
    protected internal virtual IEnumerable<Product> Products { get => _products; }


    public Order() { }

    public virtual void CreateDraftForClient(int id)
    {
         /// => business rule validation of value 

         _client= new Client(id);

          /// => event     
     }
}

public class Client
{
    private int _id;
    public virtual int Id { get => _id; }

    private Client() { }
    protected internal Client(int id) 
    {
        SetId(id);
    }

    private void SetId(int id)
    {
        _id = id; 
    }
}

有没有什么方法可以不用改变客户的结构就可以做到这一点?如果没有,我还有什么其他选择

鉴于当前的定义,
Order
没有简单的方法可以被模仿

通过将所需参数传递给mock,尝试通过受保护的构造函数创建mock

int id = 1;
var clientMock = new Mock<Client>(id);
clientMock.SetupGet(prop => prop.Id).Returns(id);

var orderMock = new Mock<Order>();
orderMock.SetupGet(prop => prop.Client).Returns(clientMock.Object);
intid=1;
var clientMock=新模拟(id);
SetupGet(prop=>prop.Id).Returns(Id);
var orderMock=new Mock();
SetupGet(prop=>prop.Client).Returns(clientMock.Object);

您可以尝试使用反射创建它,或者创建一个调用受保护构造函数的派生类,这是当前的情况,但我希望有一个现成的解决方案OK这感觉像是一个问题。你真正想要达到的最终目标是什么?你到底想测试什么?我想做的是创建一些用测试所需数据初始化的对象。所以我有一个SetUp类,在这个类构造函数中,我为我拥有的每个实体创建mock。Setup类提供了一组方法,这些方法初始化处于不同状态的实体,然后返回实际对象Mock.object。方法GetEntityInFullValidState()的示例,该方法将使用EntityLock创建完全初始化的实体(所有道具和属性)。我已经根据我的真实场景更新了这些类,如果
clientMock=newmock(1),可能会更有意义起作用。
Message: System.AggregateException : One or more errors occurred. (Can not instantiate proxy of class: Client. Could not find a parameterless constructor.) (The following constructor parameters did not have matching fixture data: eRxTestSetup testSetup)
---- Castle.DynamicProxy.InvalidProxyConstructorArgumentsException : Can not instantiate proxy of class: Client. Could not find a parameterless constructor.
---- The following constructor parameters did not have matching fixture data: eRxTestSetup testSetup
int id = 1;
var clientMock = new Mock<Client>(id);
clientMock.SetupGet(prop => prop.Id).Returns(id);

var orderMock = new Mock<Order>();
orderMock.SetupGet(prop => prop.Client).Returns(clientMock.Object);