2013-12-09 3 views
2

Я в процессе преобразования наших модульных тестов от Moles до новых подделок VS 2012. Несколько наших модульных тестов «поддельные» RNGCryptoServiceProvider. Мы смогли «отмотать» это, но, похоже, для него не создано Shim для подделок. Другими словами, я ожидал бы найти ShimRNGCryptoServiceProvider.Не может показаться Fake RNGCryptoServiceProvider

Еще более интересным аспектом является то, что я нашел электронную книгу онлайн под названием «Лучшее тестирование единицы с помощью Microsoft Fakes». Там они показывают пример фальсификации функции Random. Вот пример.

System.Fakes.ShimRandom.Constructor = (real) => { };   
System.Fakes.ShimRandom.AllInstances.NextDouble = this.NextDouble; 
System.Fakes.ShimRandom.AllInstances.NextInt32Int32 = this.NextInt32Int32; 
private int NextInt32Int32(Random random, int i, int arg3) 
{ 
    return (i + arg3)/2; 
} 

Я даже не вижу System.Fakes.ShimRandom в моем проекте. Только два Шины Я вижу для System.Fakes is ShimDateTime и ShimGuid.

  • Я создал сборку Подделки для системы (которая дала мне mscorlib.4.0.0.0.Fakes и System.4.0.0.0.Fakes)
  • Я не изменил файлы конфигурации (mscorlib.fakes и системы. подделки)
  • У меня есть проект моих подделок, чтобы построить платформу «Любой процессор».
  • Мы используем .Net Framework 4.5 и VS 2012 Ultimate.

Я вижу кучу окурков, в том числе и System.Fakes.StubRandomSystem.Fakes.StubRandomNumberGenerator, но Столбики не будут работать для меня, потому что у меня нет никакого способа их инжекции в код тестируемого.

  1. Любая идея, почему я не получаю ShimRandom, когда кажется, что я должен быть, так как есть пример этого в eBook?
  2. Как мне «подделать» RNGCryptoServiceProvider?
+0

'RNGCryptoServiceProvider' является' запечатаны class'. Это конкретная реализация, которую вы не можете изменить. Вероятно, вы должны начать с попытки подделать свой базовый класс, более общий ['RandomNumberGenerator'] (http://msdn.microsoft.com/en-us/library/system.security.cryptography.randomnumbergenerator (v = vs.110) .aspx). –

+1

Кроме того, вы упомянули, что заглушка не будет работать, потому что вы не можете ее вводить. Вероятно, вам следует сказать, что либо вы не должны писать этот тест, либо вам следует вводить зависимость. – Magus

ответ

5

Эти типы в настоящее время не поддерживаются каркасом MS Fakes.

enter image description here

Другой способ найти неподдерживаемые типы, в файле .fakes добавить Diagnostic = True Например.

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic ="true"> 
    <Assembly Name="mscorlib" Version="4.0.0.0"/> 

ОБНОВЛЕНО

Обратите внимание, что вы просто не можете подделать все. Это также означает, что вы просто не можете обойти все. MS решила не проводить некоторые системные классы из-за некоторых соображений дизайна. Нет определенного списка, который предоставила MS, поскольку типы могут быть Fake'd на основе комбинации пользовательских версий .NET и целевых .NET-фреймворков. Например, в .NET 4 некоторые члены в System.Security, типы в System.Threading Fakes не будут генерироваться так, как Shims.

Вы можете попробовать переопределить это поведение, например, добавив следующий XML к .Fakes файл

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic ="true"> 
    <Assembly Name="mscorlib" Version="4.0.0.0"/> 
    <ShimGeneration> 
     <Add FullName="System.Security.Cryptography"/> 
    </ShimGeneration> 
</Fakes> 

выше будет производить те же предупреждения, которые я представил в моем ответе выше. Это означает, что они не поддерживаются.

Но, как я уже говорил, это комбинация версии .NET и целевой структуры. Если вы можете изменить целевую платформу .NET frameowork, например .NET 2, все еще используя версию mscorlib 4.0.0.0, вы увидите, что Shim get создан для RNGCryptoServiceProvider.

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic="true" TargetFrameworkVersion="2.0.0.0"> 
    <Assembly Name="mscorlib" Version="4.0.0.0"/> 
    <ShimGeneration> 
     <Clear/> 
     <Add FullName="System.Security.Cryptography"/> 
    </ShimGeneration> 
</Fakes> 

То же применимо к RandomNumberGenerator.

enter image description here

+0

Это заглушка. Я ищу Шимс. И любая идея, почему я не получаю ShimRandom, когда Microsoft использует это в качестве примера? –

+0

@GeneS Используется. Он основан на версии выполнения .NET и целевой среде. См. Мой ответ «ОБНОВЛЕНО» для подробного объяснения. – Spock

Смежные вопросы