using System.Threading.Tasks;
public interface IPaymentProvider
public interface IPaymentObjects
public class BraintreePaymentProvider : IPaymentProvider
public class BraintreePaymentObjectNewCard : IPaymentObjects
public class PaymentResult
public string PaymentError {get;set;}
public string OrderId{get;set;}
public string Redirect{get;set;}
public static class PaymentMethodManager
public static async Task<PaymentResult> PayAsync(IPaymentProvider payProvider, IPaymentObjects payObjects)
return new PaymentResult();
public static void Main()
var paymentResult = new PaymentResult { OrderId = "ORD123", PaymentError = "None", Redirect = String.Empty };
Shim paymentMethodManagerShim = Shim.Replace(() => PaymentMethodManager.PayAsync(Is.A<IPaymentProvider>(), Is.A<IPaymentObjects>()))
.With(delegate (BraintreePaymentProvider payProvider, BraintreePaymentObjectNewCard payObjects) { return Task.FromResult(paymentResult); });
PoseContext.Isolate(() => {
var result = PaymentMethodManager.PayAsync(new BraintreePaymentProvider(), new BraintreePaymentObjectNewCard());
}, paymentMethodManagerShim);
Console.WriteLine("Hello World");