Предыстория:
Я создал простую прокси для моего Wcf-клиента, основанную частично на примерах, найденных в Интернете, и частично на моих потребностях.
Использование для создания клиентского прокси, как известно:
WcfClientProxy<IServicecontract> clientProxy =
new WcfClientProxy<IServiceContract>();
WcfClientProxy имеет метод Execute, который принимает: Expression<Func<TChannel, TResult>>
или Expression<Action<TChannel>>
.
Чего я пытаюсь достичь:
Я пытаюсь издеваться над этим, используя Moq, чтобы я мог проверить вызовы, сделанные в контракте службы через клиент.
Так издеваться над таким звонком ..
clientProxy.Execute(m=>m.DoSomeAction(5));
Проблема:
Проблема в том, что мокап не работает. Я получаю эту ошибку:
"выбросил исключение: System.NullReferenceException: ссылка на объект не указывает на экземпляр объекта".
Мой контракт на тестовое обслуживание:
public interface ITestingServiceInterface : System.ServiceModel.IClientChannel
{
string Version();
VersionDetail VersionDetail();
IList<VersionDetail> VersionDetails();
void DoSomeDelete(int itemId);
}
Интерфейс прокси клиента wcf:
public interface IWcfClientProxy<TChannel> where TChannel : ICommunicationObject
{
bool ThrowOnException { get; set; }
TResult Execute<TResult>(Expression<Func<TChannel, TResult>> operation);
void Execute(Expression<Action<TChannel>> expression);
}
Моя попытка теста и макета с настройкой..
private List<ProdItem> items;
private Mock<IWcfClientProxy<ITestingServiceInterface>> mockClientProxy;
[TestInitialize]
public void SettingUp()
{
mockClientProxy = new Mock<IWcfClientProxy<ITestingServiceInterface>>();
items = new List<ProdItem>();
for( int i =0; i<10; i++){
items.Add(new ProdItem { ProdItemId = i, LocalStock = i });
}
}
[TestMethod]
public void SimpleTest()
{
mockClientProxy.Setup(m => m.Execute(x => x.DoSomeDelete(It.IsAny<int>()))).Callback(RemoveItem);
var client = mockClientProxy.Object;
client.Execute(x => x.DoSomeDelete(4));
Assert.AreEqual(9, items.Count);
}
public void RemoveItem()
{
items.RemoveAt(items.Count - 1);
}
Ошибка для этого теста на самом деле заключается в том, что утверждение неверно, кажется, что обратный вызов никогда не выполняется.
Я уверен, что только что сделал что-то глупое.
Обновление: показан пример того, что я хотел бы проверить, работает ли вышеперечисленное..
[TestMethod]
public void SimpleTest()
{
mockClientProxy.Setup(m => m.Execute(x => x.DoSomeDelete(It.IsAny<int>()))).Callback(RemoveItem);
var client = mockClientProxy.Object;
var stockHelper = new StockHelper(client);
stockHelper.DeleteItem(5);
Assert.AreEqual(9, items.Count);
}
В приведенном выше примере я тестирую класс StockHelper, который использует клиентский прокси в своем конструкторе, через который он выполняет вызовы WCF.
Чтобы протестировать StockHelper (или что-то еще), мне нужно иметь возможность издеваться над клиентом и его служебными вызовами. Вышеупомянутый (1-й) пример указывает на то, что у меня возникла проблема с попыткой сделать это.
Я надеюсь, что это имеет смысл, пожалуйста, обратите внимание, что моя конечная цель не в том, чтобы протестировать макет... это как раз то, где я должен попытаться отладить мою проблему.