私はこのクラス階層を持っています
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;
}
}
そして、完全に初期化された順序のモックを作成したい
clientMock = new Mock<Client>();
clientMock.SetupGet(prop => prop.Client).Returns(1);
orderMock = new Mock<Order>();
orderMock.SetupGet(prop => prop.Client).Returns(orderMock.Object);
例外:
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
クライアントの構造を変更せずにそうすることができる方法はありますか?または、そうでない場合、他にどのようなオプションがありますか?
Order
現在の定義を考えると、嘲笑される簡単な方法はありません。
目的の引数をモックに渡して、保護されたコンストラクターを介してモックを作成してみてください
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);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加