System.TypeLoadException: Method 'SelectAll' on type 'SprocQuery`1Proxya9ec02f782ce4d53b43c0f070f08b3c2' from assembly 'DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=a621a9e7e5c32e69' tried to implicitly override a method with weaker type parameter constraints.
C>System.TypeLoadException: Method 'SelectAll' on type 'SprocQuery`1Proxya9ec02f782ce4d53b43c0f070f08b3c2' from assembly 'DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=a621a9e7e5c32e69' tried to implicitly override a method with weaker type parameter constraints.
C>возможно ли их подружить?
У меня аналогичный пример с использованием TypeMock отработал без ошибок.
Пишите в техподдержку Rhino. Ошибка явно в их коде. Скорее всего, в реализации заглушки метода
public virtual L SelectAll<L>(DbManager db)
where L : IList<T>, new()
{
return SelectAll<L>(db, new L());
}
Кстати, сам BLToolkit не проходит вот такой тест:
public abstract class Test<T>
{
public abstract L SelectAll<L>() where L : IList<T>, new();
}
[Test]
void GenericMixTest()
{
Test<int> t = TypeAccessor.CreateInstance<Test<int>>();
List<int> o = t.SelectAll<List<int>>();
}
Валится с точно таким же исключением. Возможно проблема в SRE, но это нужно проверить.
БП>Официальный workaround, как обычно, использовать Mono. В Mono не считают зазорным исправлять ошибки в SRE. Будем ждать .Net 4.0, может там исправят.
печально, если все пойдет таким путем, то МS купит Mono как сделала недавно с jQuery
Здравствуйте, cadet354, Вы писали:
C>печально, если все пойдет таким путем, то МS купит Mono как сделала недавно с jQuery
Как раз это тот редкий случай, когда интерес, проявляемый Майкрософт не привёл к печальным последствиям. Здесь сказано только что они хотят вложить денег в этот проект.
Ни о какой покупке и смене лицензии речи пока не идёт. Поживём увидим.
Здравствуйте, Блудов Павел, Вы писали:
БП>Здравствуйте, cadet354, Вы писали:
C>>интересно как это делает TypeMock, примером не поделитесь? БП>Они похоже единственные, кто делает это правильно
Здравствуйте, cadet354, Вы писали:
C>отваливается с таким сообщением: C>
C>TypeMock.TypeMockException:
C>*** Cannot return a value for SprocQuery`1.SelectByKey() because no value was set. use recorder.Return().
C>но я в стороке: recorder.Return(new Source {SourceId = 1}); указал что должно как-бы вернуться.
ну так ты же замокал совсем другой объект. Надо как то так:
[Test]
public void UsingPartialMocks()
{
var mockedDataBases =
RecorderManager.CreateMockedObject<SprocQuery<Source>>();
using (
RecordExpectations recorder = RecorderManager.StartRecording())
{
mockedDataBases.SelectByKey(123);
recorder.Return(new Source {SourceId = 1});
}
Assert.IsTrue(mockedDataBases.SelectByKey(123).SourceId == 1);
MockManager.Verify();
}
я к тому же не уверен что создание mock-а внутри RecorderManager.StartRecording() — это правильно. По крайней мере из их туториалов я такой практики не проследил
S>ну так ты же замокал совсем другой объект. Надо как то так:
идея была следующая:
"замокать" любое обращение к SprocQuery<Source>.SelectByKey(123), а не только определенного обьекта,т.е. я хотел описать паттерн который нужно перехватывать, возможно я слишком много хочу .
Пока переписал на интерфейсы, и подход в стиле Moq оказался мне более понятным.