Мой подход заключается в том, чтобы включить ЧЕТЫРЕ разных изображения разных размеров для телефонов, планшетов, настольных ПК, больших настольных ПК, но показывать только ОДИН, используя отзывчивые служебные классы начальной загрузки, как указано ниже:
<!--<a class="navbar-brand" href="<?php echo home_url(); ?>/"><?php bloginfo('name'); ?></a>-->
<a class="navbar-brand visible-xs" href="<?php echo home_url(); ?>/"><img src="/assets/logo-phone.png" alt="<?php bloginfo('name'); ?> Logo" /></a>
<a class="navbar-brand visible-sm" href="<?php echo home_url(); ?>/"><img src="/assets/logo-tablet.png" alt="<?php bloginfo('name'); ?> Logo" /></a>
<a class="navbar-brand visible-md" href="<?php echo home_url(); ?>/"><img src="/assets/logo-desktop.png" alt="<?php bloginfo('name'); ?> Logo" /></a>
<a class="navbar-brand visible-lg" href="<?php echo home_url(); ?>/"><img src="/assets/logo-large.png" alt="<?php bloginfo('name'); ?> Logo" /></a>
Примечание. Вы можете заменить закомментированная строка с предоставленным кодом. Замените php-код, если вы не используете WordPress.
Редактировать Примечание 2: Да, это добавляет запросы на ваш сервер при загрузке страницы, что может немного замедлиться, но если вы используете метод фонового спрайта css, скорее всего, логотип не будет напечатан при печати страницы и кода выше должно улучшиться SEO.
Я создал пользовательский тип для System.Drawing.Color, и вот как я тестировал его с помощью MSTest и Moq .
ColorUserType.cs:
public class ColorUserType : IUserType { public object Assemble( object cached, object owner ) { return cached; } public object DeepCopy( object value ) { return value; } public object Disassemble( object value ) { return value; } public new bool Equals( object x, object y ) { if(ReferenceEquals(x, y ) ) { return true; } if( x == null || y == null ) { return false; } return x.Equals( y ); } public int GetHashCode( object x ) { return x == null ? typeof( Color ).GetHashCode() + 473 : x.GetHashCode(); } public bool IsMutable { get { return true; } } public object NullSafeGet( IDataReader rs, string[] names, object owner ) { var obj = NHibernateUtil.String.NullSafeGet( rs, names[0] ); if( obj == null ) { return null; } return ColorTranslator.FromHtml( (string)obj ); } public void NullSafeSet( IDbCommand cmd, object value, int index ) { if( value == null ) { ( (IDataParameter)cmd.Parameters[index] ).Value = DBNull.Value; } else { ( (IDataParameter)cmd.Parameters[index] ).Value = ColorTranslator.ToHtml( (Color)value ); } } public object Replace( object original, object target, object owner ) { return original; } public Type ReturnedType { get { return typeof( Color ); } } public SqlType[] SqlTypes { get { return new[] { new SqlType( DbType.StringFixedLength ) }; } } }
] ColorUserTypeTests.cs
[TestClass] public class ColorUserTypeTests { public TestContext TestContext { get; set; } [TestMethod] public void AssembleTest() { var color = Color.Azure; var userType = new ColorUserType(); var val = userType.Assemble( color, null ); Assert.AreEqual( color, val ); } [TestMethod] public void DeepCopyTest() { var color = Color.Azure; var userType = new ColorUserType(); var val = userType.DeepCopy( color ); Assert.AreEqual( color, val ); } [TestMethod] public void DissasembleTest() { var color = Color.Azure; var userType = new ColorUserType(); var val = userType.Disassemble( color ); Assert.AreEqual( color, val ); } [TestMethod] public void EqualsTest() { var color1 = Color.Azure; var color2 = Color.Bisque; var color3 = Color.Azure; var userType = new ColorUserType(); var obj1 = (object)color1; var obj2 = obj1; Assert.IsFalse( userType.Equals( color1, color2 ) ); Assert.IsTrue( userType.Equals( color1, color1 ) ); Assert.IsTrue( userType.Equals( color1, color3 ) ); Assert.IsFalse( userType.Equals( color1, null ) ); Assert.IsFalse( userType.Equals( null, color1 ) ); Assert.IsTrue( userType.Equals( null, null ) ); Assert.IsTrue( userType.Equals( obj1, obj2 ) ); } [TestMethod] public void GetHashCodeTest() { var color = Color.Azure; var userType = new ColorUserType(); Assert.AreEqual( color.GetHashCode(), userType.GetHashCode( color ) ); Assert.AreEqual( typeof( Color ).GetHashCode() + 473, userType.GetHashCode( null ) ); } [TestMethod] public void IsMutableTest() { var userType = new ColorUserType(); Assert.IsTrue( userType.IsMutable ); } [TestMethod] public void NullSafeGetTest() { var dataReaderMock = new Mock(); dataReaderMock.Setup( m => m.GetOrdinal( "white" ) ).Returns( 0 ); dataReaderMock.Setup( m => m.IsDBNull( 0 ) ).Returns( false ); dataReaderMock.Setup( m => m[0] ).Returns( "#ffffff" ); var userType = new ColorUserType(); var val = (Color)userType.NullSafeGet( dataReaderMock.Object, new[] { "white" }, null ); Assert.AreEqual( "ffffffff", val.Name, "The wrong color was returned." ); dataReaderMock.Setup( m => m.IsDBNull( It.IsAny() ) ).Returns( true ); Assert.IsNull( userType.NullSafeGet( dataReaderMock.Object, new[] { "black" }, null ), "The color was not null." ); dataReaderMock.VerifyAll(); } [TestMethod] public void NullSafeSetTest() { const string color = "#ffffff"; const int index = 0; var mockFactory = new MockFactory( MockBehavior.Default ); var parameterMock = mockFactory.Create(); parameterMock.SetupProperty( p => p.Value, string.Empty ); var parameterCollectionMock = mockFactory.Create(); parameterCollectionMock.Setup( m => m[0] ).Returns( parameterMock.Object ); var commandMock = mockFactory.Create(); commandMock.Setup( m => m.Parameters ).Returns( parameterCollectionMock.Object ); var userType = new ColorUserType(); userType.NullSafeSet( commandMock.Object, ColorTranslator.FromHtml( color ), index ); Assert.AreEqual( 0, string.Compare( (string)( (IDataParameter)commandMock.Object.Parameters[0] ).Value, color, true ) ); userType.NullSafeSet( commandMock.Object, null, index ); Assert.AreEqual( DBNull.Value, ( (IDataParameter)commandMock.Object.Parameters[0] ).Value ); mockFactory.VerifyAll(); } [TestMethod] public void ReplaceTest() { var color = Color.Azure; var userType = new ColorUserType(); Assert.AreEqual( color, userType.Replace( color, null, null ) ); } [TestMethod] public void ReturnedTypeTest() { var userType = new ColorUserType(); Assert.AreEqual( typeof( Color ), userType.ReturnedType ); } [TestMethod] public void SqlTypesTest() { var userType = new ColorUserType(); Assert.AreEqual( 1, userType.SqlTypes.Length ); Assert.AreEqual( new SqlType( DbType.StringFixedLength ), userType.SqlTypes[0] ); } }
Я думал, что могу имитировать / подделать некоторые зависимости здесь, но в итоге решил, что лучший способ сделать это - использовать базу данных.
Некоторые вещи, которые я узнал на этом пути:
1) при изучении методов NHibernate стоит приложить усилия, чтобы иметь специальный набор инструментов, включая способ быстрой настройки базы данных и тестирования для нее (те же самые виды гибкой разработки инструменты, которые вам понадобятся для всего остального, на самом деле) и специальная лаборатория тестирования, в которую вы не вкладываете эмоциональных средств.
2) mocks не поддаются интерфейсам, которыми вы не владеете, например IDataReader.
Приветствую