Как Вы дразните кэширующийся объект в asp.net mvc?

Если это подтверждение того, что всегда есть значение, такое как 3 цифры до десятичного знака, то ниже регулярное выражение можно использовать для получения требуемого результата-

select SUBSTRING(fieldName, PATINDEX('%[0-9][0-9][0-9].[0-9]%', fieldName), LEN(fieldName))
from table_name

Если ваше требование что-то изменило, пожалуйста, прокомментируйте. [112 ]

17
задан Community 17 November 2012 в 09:32
поделиться

3 ответа

РЕДАКТИРОВАТЬ : я нашел более простой способ сделать это, по крайней мере, когда вы тестируете с пустым кешем. Используйте HttpRunTime.Cache в качестве возвращаемого значения для вашего ожидания в свойстве Cache HttpContext. Для более сложных сценариев использование оболочки и насмешек все еще может быть лучшим способом справиться с этим - например, если вам нужно протестировать исключения из кэша.

var httpContext = MockRepository.GenerateMock<HttpContextBase>();
httpContext.Expect( h => h.Cache ).Return( HttpRunTime.Cache ).Repeat.Any()

Оригинал :

Класс оболочки - это путь, но я думаю, что вы применяете это не в том месте. Я бы дал своему контроллеру свойство CacheWrapper, а затем создал конструктор, который позволил бы мне передать экземпляр CacheWrapper, в который можно установить это свойство. По умолчанию контроллер создает CacheWrapper, используя HttpContext.Current.Cache. В вашем тестовом коде создайте фиктивный CacheWrapper для передачи в конструктор контроллера. Таким образом, вам вообще не нужно создавать фиктивный объект Cache - что сложно, потому что это запечатанный класс.

В качестве альтернативы, вы можете просто создать экземпляр класса Cache и вернуть его, так как существует открытый конструктор для него. Преимущество использования макета заключается в том, что вы можете проверить, что кеш используется через ожидания, поэтому я, вероятно, согласился бы с оберткой.

public class CacheWrapper
{
  private Cache Cache { get; set; }

  public CacheWrapper()
  {
     this.Cache = HttpContext.Current.Cache;
  }

  public virtual Object Add( string key,
                             Object value,
                             CacheDependency dependencies,
                             DateTime absoluteExpiration,
                             TimeSpan slidingExpiration,
                             CacheItemPriority priority,
                             CacheItemRemovedCallback onRemoveCallback )
  {
     this.Cache.Add( key,
                     value,
                     dependencies,
                     absoluteExpiration,
                     slidingExpiration,
                     priority,
                     onRemoveCallback );
  }

  ...wrap other methods...
}


public class BaseController : Controller
{
    private CacheWrapper { get; set; }

    public BaseController() : this(null) { }

    public BaseController( CacheWrapper cache )
    {
        this.CacheWrapper = cache ?? new CacheWrapper();
    }
}

[TestMethod]
public void CacheTest()
{
   var wrapper = MockRepository.GenerateMock<CacheWrapper>();

   wrapper.Expect( o => o.Add( ... ) ).Return( ... );

   var controller = new BaseController( wrapper );

   var result = controller.MyAction() as ViewResult;

   Assert.AreEqual( ... );

   wrapper.VerifyAllExpectations();
}
21
ответ дан 30 November 2019 в 11:44
поделиться

Вы можете попробовать использовать Typemock Isolator , он подделывает запечатанные классы из коробки, поэтому эти оболочки вам не понадобятся.

0
ответ дан 30 November 2019 в 11:44
поделиться
HttpContext.Current = new HttpContext(new HttpRequest(null, "http://tempuri.org", null), new HttpResponse(null));
5
ответ дан 30 November 2019 в 11:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: